2015-12-14 6 views
5
के बीच मतभेद

के बाद पहले उदाहरण पर विचार करें:सी # संकलक त्रुटि CS0122 और CS0143

public class ClassNameExample 
{ 
    private ClassNameExample() 
    { 
     //code goes here  
    } 
} 

अब, अगर मैं एक ही विधानसभा के भीतर से ClassNameExample वर्ग का दृष्टांत करने की कोशिश, मैं की वजह से एक "दुर्गम मिल जाएगा यह सुरक्षा स्तर "कंपाइलर त्रुटि संदेश (CS0122) है।

हालांकि, अगर मैं एक अलग विधानसभा से ClassNameExample वर्ग का दृष्टांत करने की कोशिश, मैं एक हो रही है संकलक त्रुटि संदेश "प्रकार 'क्लास' कोई कंस्ट्रक्टर्स परिभाषित है" (CS0143)

कोई व्याख्या कर सकते हैं क्यों कंपाइलर उन्हें अलग देखता है?

संदर्भ के लिए, मैंने विजुअल स्टूडियो 2012, .NET 4.5 में इसे आजमाया है।

+5

मेरी ईमानदार राय में जब आप एक ही असेंबली कंपाइलर में हैं तो निजी कन्स्ट्रक्टर के अस्तित्व के बारे में पता है, इसलिए यह आपको बताता है कि यह निजी है। जब आप किसी अन्य असेंबली में होते हैं, तो यह केवल इतना नहीं जानता कि कक्षा किसी भी सार्वजनिक कन्स्ट्रक्टर का खुलासा नहीं करती है –

+0

मेरा अनुमान होगा, क्योंकि एक ही असेंबली संकलित करते समय संकलक निर्माता की परिभाषा को देखता है लेकिन यह निजी है और इसलिए दुर्गम। किसी अन्य असेंबली को संकलित करते समय, कंपाइलर केवल उस असेंबली के लिए आंतरिक इंटरफ़ेस तक पहुंच के बिना प्रकाशित इंटरफेस को देखता है। उस सार्वजनिक इंटरफेस में _is_ कोई कन्स्ट्रक्टर नहीं है, जहां तक ​​कंपाइलर का संबंध है, कोई भी नहीं है। हालांकि, मैं किसी भी विश्वसनीय स्रोत को उद्धृत नहीं कर सकता, इसलिए मुझे किसी को उत्तर के रूप में पोस्ट करने में खुशी हुई। – CompuChip

उत्तर

1

मैंने यह देखने की कोशिश की कि माइक्रोसॉफ्ट.CSharp.CSharpCodeGenerator क्या करता है और यह पता लगाने के लिए कि त्रुटियां कहाँ आती हैं, लेकिन अंत में कोड बाहरी फ़ाइलों पर निर्भर करता है।

केवल जवाब मैं तुम्हें दे सकते हैं: अगर आप

Assembly.GetExecutingAssembly().CreateInstance("ClassNameExample"); 

या Activator.CreateInstance("Your assembly", "ClassNameExample");

दोनों भी साथ साथ एक उदाहरण बनाने अशक्त लौट सार्वजनिक निर्माता पर भरोसा करते हैं, क्योंकि वे, झंडे की जाँच

public object CreateInstance(string typeName) 
    { 
     return this.CreateInstance(typeName, false, BindingFlags.Instance | BindingFlags.Public, (Binder) null, (object[]) null, (CultureInfo) null, (object[]) null); 
    } 

    Activator.CreateInstance(assemblyName, typeName, false, BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance, (Binder) null, (object[]) null, (CultureInfo) null, (object[]) null, (Evidence) null, ref stackMark); 
संबंधित मुद्दे