2011-10-11 15 views
5

मैं इस तरह मेरी struct को परिभाषित किया है:क्या इस Struct प्रकार की परिभाषा के साथ गलत है

struct Test 
{ 
    private string assayName; 
    public string AssayName { get; set; } 

    private string oldUnitName; 
    public string OldUnitName { get; set; } 

    private string newUnitName; 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) 
    { 
     assayName = name; 
     oldUnitName = oldValue; 
     newUnitName = newValue; 
    } 

} 

लेकिन यह मुझे निम्न त्रुटि देता है:

"Error 13 Backing field for automatically implemented property 'EnterResults.frmApplication.Test.NewUnitName' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer."

+2

देखें शुरुआत के लिए: संकलक मान नहीं होगा कि 'assayName' समर्थन क्षेत्र है 'AssayName' के लिए ... –

+0

आपकी संपत्ति बैकिंग फ़ील्ड तक पहुंच या उत्परिवर्तन नहीं करती है। – canon

+1

एक साइड-नोट पर, शायद आप 'वर्ग' का उपयोग करना चाहते हैं, न कि 'struct'। –

उत्तर

6

ठीक है, वहाँ वास्तव में दो मुद्दे हैं:

1. अपनी स्वत: गुणों का उपयोग करते हैं, लेकिन फिर भी खेतों उपलब्ध कराने, वहाँ के बीच कोई तारों है दो।

2. जब आप स्वचालित गुणों का उपयोग करते हैं, क्योंकि यह एक संरचना है, तो उन्हें पहले आरंभ करना होगा। आप डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल के साथ ऐसा कर सकते हैं। तो एक संशोधित संस्करण होगा:

struct Test 
{ 
    public Test(string name, string oldValue, string newValue) 
     : this() 
    { 
     AssayName = name; 
     OldUnitName = oldValue; 
     NewUnitName = newValue; 
    } 

    public string AssayName { get; private set; } 
    public string OldUnitValue { get; private set; } 
    public string NewUnitValue { get; private set; } 
} 
+0

सही। धन्यवाद – Bohn

6

आप वास्तव में कुछ भी करने से नहीं कर रहे हैं गुणों के साथ। इसे आज़माएं:

struct Test 
{ 
    public string AssayName { get; set; } 
    public string OldUnitName { get; set; } 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) : this() 
    { 
     AssayName = name; 
     OldUnitName = oldValue; 
     NewUnitName = newValue; 
    } 
} 

मुझे लगता है कि इसे संरचना प्रारंभिकरण के साथ करना है। ध्यान दें कि मैंने जो डिफॉल्ट कन्स्ट्रक्टर को जोड़ा है, उसे खुश करने के लिए लगता है :)

"इसे खुश करने के लिए लगता है" - यह कितना गूंगा है। मैंने असली जवाब के लिए चारों ओर पोक किया जो कि structs शुरू करने के तरीके से बंधे हैं। संरचना का उपयोग करने से पहले डिफ़ॉल्ट कन्स्ट्रक्टर बीमा फ़ील्ड को कॉल करना प्रारंभ किया जाता है।

2

आप Automatically Implemented Property बनाने का प्रयास कर रहे हैं, लेकिन आप "बैकिंग फ़ील्ड" (जिसका कोई स्पष्ट उपयोग नहीं है) को परिभाषित कर रहे हैं, और फिर आप अपने कन्स्ट्रक्टर में उन बैकिंग फ़ील्ड को मान निर्दिष्ट कर रहे हैं और अपनी प्रॉपर्टी को पूरी तरह से छूटे हुए हैं।

3

आप private फ़ील्ड assayName, oldUnitName और newUnitName हटा सकते हैं। तब आप अपने निर्माता में स्वचालित रूप से लागू किया गुण का संदर्भ लें:

public Test(string name, string oldValue, string newValue) 
{ 
    AssayName = name; 
    OldUnitName = oldValue; 
    NewUnitName = newValue; 
} 
2

तुम भी डिफ़ॉल्ट निर्माता कह सकते हैं:

public Test(string name, string oldValue, string newValue) : this() 
{ 
    assayName = name; 
    oldUnitName = oldValue; 
    newUnitName = newValue; 
} 

here

+0

ध्यान दें कि मैंने यह नहीं माना कि आपके सार्वजनिक और निजी चर संबंधित थे (गोरिल्ला के जवाब कोडिंग देखें) – KevinDTimm

संबंधित मुद्दे