सदस्य '<पद्धति>' को उदाहरण संदर्भ से एक्सेस नहीं किया जा सकता है


195

मैं C # में शामिल हो रहा हूं और मुझे यह समस्या आ रही है:

namespace MyDataLayer
{
    namespace Section1
    {
        public class MyClass
        {
            public class MyItem
            {
                public static string Property1{ get; set; }
            }
            public static MyItem GetItem()
            {
                MyItem theItem = new MyItem();
                theItem.Property1 = "MyValue";
                return theItem;
            }
        }
     }
 }

मेरा यह कोड एक UserControl पर है:

using MyDataLayer.Section1;

public class MyClass
{
    protected void MyMethod
    {
        MyClass.MyItem oItem = new MyClass.MyItem();
        oItem = MyClass.GetItem();
        someLiteral.Text = oItem.Property1;
    }
}

सब कुछ ठीक काम करता है, सिवाय जब मैं एक्सेस करने जाता हूं Property1। IntelliSense केवल देता है मुझे " Equals, GetHashCode, GetType, और ToString" विकल्प के रूप में। जब मैं पर माउसoItem.Property1 , तो विजुअल स्टूडियो मुझे यह स्पष्टीकरण देता है:

MemberMyDataLayer.Section1.MyClass.MyItem.Property1.getcannot be accessed with an instance reference, qualify it with a type name instead

मैं इस बारे में अनिश्चित हूं कि इसका क्या मतलब है, मैंने कुछ गोलगप्पे किए लेकिन इसका पता नहीं लगा पाया।

जवाबों:


283

C # में, VB.NET और Java के विपरीत, आप staticउदाहरण वाक्य रचना के साथ सदस्यों तक नहीं पहुँच सकते । तुम्हें करना चाहिए:

MyClass.MyItem.Property1

उस संपत्ति को देखें या उस staticसंशोधक को हटा दें Property1(जो कि आप शायद करना चाहते हैं)। क्या staticहै, इसके बारे में एक वैचारिक विचार के लिए, मेरे अन्य उत्तर को देखें


45

आप केवल प्रकार के नाम का उपयोग करके स्थैतिक सदस्यों तक पहुँच सकते हैं।

इसलिए, आपको या तो लिखने की जरूरत है,

MyClass.MyItem.Property1

या (यह शायद आपको क्या करने की आवश्यकता है) इसकी परिभाषा से कीवर्ड Property1को हटाकर एक उदाहरण संपत्ति बनाएं static

स्थिर गुणों को उनकी कक्षा के सभी उदाहरणों के बीच साझा किया जाता है, ताकि उनका केवल एक मूल्य हो। जिस तरह से इसे अब परिभाषित किया गया है, आपके MyItem वर्ग के किसी भी उदाहरण को बनाने का कोई मतलब नहीं है।


यह "या (यह शायद आपको क्या करने की आवश्यकता है) संपत्ति 1 को अपनी परिभाषा से स्थैतिक कीवर्ड को हटाकर एक संपत्ति बनाएं।" सफलता की कुंजी है !! धन्यवाद
tim687

29

मेरे पास एक ही मुद्दा था - हालांकि कुछ साल बाद, कुछ को कुछ संकेत मिल सकते हैं:

'स्टैटिक ’आभार का प्रयोग न करें!

समझें कि रन-टाइम और संकलित समय शब्दार्थ (व्यवहार) और वाक्य-विन्यास दोनों के संदर्भ में 'स्थिर' का क्या अर्थ है।


  • इसके पहले उपयोग से कुछ समय पहले एक स्थिर इकाई का निर्माण स्वचालित रूप से किया जाएगा ।

  • एक स्थिर इकाई में एक भंडारण स्थान आवंटित होता है, और यह
    उस इकाई तक पहुंचने वाले सभी लोगों द्वारा साझा किया जाता है।

  • एक स्थैतिक इकाई को केवल उसके प्रकार के माध्यम से पहुँचा जा सकता है, न
    कि उस प्रकार के उदाहरण के माध्यम से।

  • एक स्थिर विधि में 'इस' तर्क का निहितार्थ नहीं है, जैसा कि एक उदाहरण विधि है। (और इसलिए एक स्थैतिक विधि में कम निष्पादन
    ओवरहेड होता है - उनका उपयोग करने का एक कारण।)

  • स्थैतिक संस्थाओं का उपयोग करते समय थ्रेड सुरक्षा के बारे में सोचें।

MSDN में स्थिर पर कुछ विवरण:


4

जैसा कि पूरी तरह से समझाया गया है, इस मामले में स्थैतिक का उपयोग करने की आवश्यकता नहीं है। आप बिना किसी GetItem()विधि के भी अपनी संपत्ति का इनिशियलाइज़ेशन कर सकते हैं , नीचे दोनों का उदाहरण:

namespace MyNamespace
{
    using System;

    public class MyType
    {
        public string MyProperty { get; set; } = new string();
        public static string MyStatic { get; set; } = "I'm static";
    }
}

उपभोक्ता:

using MyType;

public class Somewhere 
{
    public void Consuming(){

        // through instance of your type
        var myObject = new MyType(); 
        var alpha = myObject.MyProperty;

        // through your type 
        var beta = MyType.MyStatic;
    }
}       

3

एक उदाहरण संदर्भ के साथ पहुँचा नहीं जा सकता

इसका मतलब है कि आप एक स्टेटिक विधि को बुला रहे हैं और इसे एक उदाहरण के रूप में पारित कर रहे हैं। सबसे आसान उपाय स्टैटिक को हटाना है, जैसे:

सार्वजनिक स्थिर शून्य ExportToExcel (IEnumerable डेटा, स्ट्रिंग शीट नाम) {


2

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैंने सिर्फ 3 घंटे बिताए यह जानने की कोशिश की कि मेरा मुद्दा क्या था। मैं सामान्यतया जानता हूं कि इस त्रुटि का क्या मतलब है, लेकिन आप इसे और भी सूक्ष्म तरीके से चला सकते हैं। मेरा मुद्दा मेरा क्लाइंट क्लास था (एक इंस्टेंस क्लास से स्टैटिक मेथड को कॉल करने वाली) के पास एक अलग तरह की प्रॉपर्टी थी, लेकिन इसे स्टैटिक मेथड का नाम दिया गया था। कंपाइलर द्वारा रिपोर्ट की गई त्रुटि यहां बताई गई समान थी, लेकिन समस्या मूल रूप से नाम टकराव की थी।

किसी और को यह त्रुटि हो रही है और उपरोक्त में से कोई भी मदद नहीं करता है, अपने आवृत्ति वर्ग को नामस्थान नाम के साथ पूरी तरह से योग्य बनाने का प्रयास करें। .. () इसलिए कंपाइलर आपके द्वारा दिए गए सटीक नाम को देख सकता है।


मुझे यह मददगार लगा। मेरा नाम टक्कर था और उसे पता भी नहीं था। जैसे ही मैंने अपनी विधि कॉल से पहले नाम स्थान जोड़ा, समस्या हल हो गई।
अधिकतम

1

जांचें कि क्या आपके कोड में एक नाम स्थान है जो सही अधिकांश भाग आपके स्थिर वर्ग के नाम से मेल खाता है।

एक स्थिर बार वर्ग को देखते हुए , नामस्थान फू पर परिभाषित किया गया , एक विधि जंप या एक संपत्ति को लागू करने , संभावना है कि आप संकलक त्रुटि प्राप्त कर रहे हैं क्योंकि बार पर समाप्त होने वाला एक और नाम स्थान भी है । हां, मछली का सामान ;-)

यदि ऐसा है, तो इसका मतलब है कि आपके द्वारा यूज़िंग बार का उपयोग करना; और एक Bar.Jump () कॉल, इसलिए निम्न में से एक समाधान आपकी आवश्यकताओं के अनुसार होना चाहिए:

  • पूरी तरह से नाम के अनुसार स्थिर वर्ग नाम को अर्हता प्राप्त करें, जिसके परिणामस्वरूप Foo.Bar.Jump () घोषणा है। यूज़िंग बार को हटाने की भी आवश्यकता होगी ; बयान
  • एक अलग नाम से नाम स्थान बार का नाम बदलें ।

मेरे मामले में, फोलोइलिंग कंपाइलर त्रुटि एक डेटाबेस पर एक EF ( एंटिटी फ्रेमवर्क ) रिपोजिटरी प्रोजेक्ट पर रखा गया था। Inetitializer () कॉल:

Member 'Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM

जब मैंने MyProject.ORM को जोड़ा तो यह त्रुटि उत्पन्न हुई डेटाबेस नामस्थान, जो उपसर्ग ( डेटाबेस ), जैसा कि आपने देखा हो सकता है, डेटाबेस .SetInitializer से मेल खाता है वर्ग नाम से ।

इसमें, चूंकि EF के डेटाबेस स्टैटिक क्लास पर मेरा कोई नियंत्रण नहीं है और मैं अपने कस्टम नेमस्पेस को भी संरक्षित करना चाहूंगा, मैंने EF के डेटाबेस स्टैटिक क्लास को इसके नेमस्पेस System.Data.Entity के साथ पूरी तरह से क्वालिफाई करने का फैसला किया , जिसके परिणामस्वरूप निम्न कमांड का उपयोग किया गया, जो संकलन सफल:

System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)

आशा करता हूँ की ये काम करेगा


1

मुझे यहाँ सी # कंपाइलर त्रुटि CS0176 के लिए, (डुप्लिकेट) प्रश्न स्टैटिक सदस्य उदाहरण संदर्भ समस्या के लिए मिला

मेरे मामले में, त्रुटि इसलिए हुई क्योंकि मेरे पास एक स्थिर विधि और उसी नाम के साथ एक विस्तार विधि थी। उसके लिए, एक ही नाम के साथ स्टेटिक विधि और विस्तार विधि देखें ।

[हो सकता है कि यह एक टिप्पणी होनी चाहिए थी। क्षमा करें कि मेरे पास अभी तक पर्याप्त प्रतिष्ठा नहीं है।]


1

यह त्रुटि का कारण बनता है:

MyClass aCoolObj = new MyClass();
aCoolObj.MyCoolStaticMethod();

यह तय है:

MyClass.MyCoolStaticMethod();

स्पष्टीकरण:

आप किसी वस्तु के उदाहरण से एक स्थिर विधि नहीं कह सकते। स्थिर तरीकों का पूरा बिंदु वस्तुओं के उदाहरणों से बंधा हुआ नहीं है, बल्कि उस वस्तु के सभी उदाहरणों के माध्यम से बने रहना है, और / या वस्तु के किसी भी उदाहरण के बिना उपयोग किया जाना है।


0
YourClassName.YourStaticFieldName

आपके स्थैतिक क्षेत्र के लिए ऐसा लगेगा:

public class StaticExample 
{
   public static double Pi = 3.14;
}

एक अन्य वर्ग से, आप निम्न फ़ील्ड को निम्नानुसार एक्सेस कर सकते हैं:

    class Program
    {
     static void Main(string[] args)
     {
         double radius = 6;
         double areaOfCircle = 0;

         areaOfCircle = StaticExample.Pi * radius * radius;
         Console.WriteLine("Area = "+areaOfCircle);

         Console.ReadKey();
     }
  }

शायद आप अपने समाधान को प्रश्न के उदाहरण में अनुवाद कर सकते हैं और इस बारे में थोड़ी व्याख्या कर सकते हैं कि स्थिर क्षेत्र कक्षा की परिभाषाओं और उदाहरणों के साथ कैसे काम करते हैं?
noetix

आपकी टिप्पणी के लिए धन्यवाद, अब कैसे के बारे में @ एलेक्स?
हेडेगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.