2010-11-01 13 views
44

सी # में, निम्न कोड को संकलित नहीं करता है:क्यों सी # सदस्य के नाम संलग्न प्रकार नाम के समान नहीं हो सकता है?

class Foo { 

    public string Foo; 

} 

सवाल यह है: क्यों?

अधिक वास्तव में, मैं समझता हूँ कि इस वजह से (मैं बोली) संकलन नहीं करता है:

सदस्य नाम नहीं है, ठीक है

ठीक उनके संलग्नित प्रकार के रूप में ही हो सकता है। मैं समझता हूं कि, मैं इसे फिर से नहीं करूँगा, मैं वादा करता हूं।

लेकिन मुझे वास्तव में क्यों नहीं समझता है संकलक किसी भी क्षेत्र को एक संलग्न प्रकार के समान नाम लेने से इंकार कर देता है। अंतर्निहित मुद्दा क्या है जो मुझे ऐसा करने से रोकता है?

उत्तर

43

कड़ाई से बोलते हुए, यह सी # द्वारा लगाई गई सीमा है, जो वाक्यविन्यास की सुविधा के लिए सबसे अधिक संभावना है। एक निर्माता के लिए एक विधि शरीर है, लेकिन आईएल में अपने सदस्य प्रविष्टि ".ctor" के रूप में निरूपित किया जाता है और यह एक सामान्य विधि की तुलना में थोड़ा अलग मेटाडाटा है (प्रतिबिंब कक्षाओं में, ConstructorInfo MethodBase, नहीं MethodInfo से निकला है।) मैं नहीं मानता वहाँ एक नेट सीमा यह है कि, बाहरी प्रकार के रूप में एक ही नाम के साथ एक सदस्य (या यहां तक ​​कि एक विधि) बनाने से रोकता है हालांकि मैं इसे करने की कोशिश नहीं की है है।


मैं उत्सुक था, इसलिए मैंने पुष्टि की कि यह एक .NET सीमा नहीं है। VB में निम्नलिखित वर्ग बनाएँ:

var class1 = new Class1(); 
class1.Class1(); 
+1

यह शायद सबसे अच्छा, सबसे पूरा जवाब यहां है। वीबी में (मुझे लगता है कि मैंने अभी अपने मुंह में थोड़ी सी फेंक दी है) सीटीआर सब न्यू() ... –

+0

क्या आपका मतलब है कि "सदस्य बनाने से रोकता है" जिस तरह से वह इस सवाल में वर्णन करता है? हाँ, यह इस सवाल का पूरा कारण है। यदि आपका मतलब है 'सार्वजनिक स्ट्रिंग फू {get; set;} सार्वजनिक शून्य Foo() {}' तो फिर भी इसकी अनुमति नहीं है। – jcolebrand

+1

सवाल यह है कि अगर सी # इसे अस्वीकार करता है या यदि .NET टाइपसिस्टम इसे अस्वीकार करता है। और मुझे लगता है कि यह सिर्फ सी # है। – CodesInChaos

18

क्योंकि फू निर्माता के नाम के रूप में आरक्षित है।

तो यदि आपके कोड की अनुमति है - तो आप कन्स्ट्रक्टर को क्या कहेंगे?

भले ही निर्माता को एक विशेष मामले के रूप में और विधि/सदस्य बाध्यकारी में नए नियमों का परिचय देकर ऐसा करना संभव हो - क्या यह एक अच्छा विचार होगा? यह अनिवार्य रूप से कुछ बिंदु पर भ्रम हो जाएगा।

+3

लेकिन निर्माता कोई विधि या कुछ नहीं है, इसे शेष कोड में हस्तक्षेप नहीं करना चाहिए। –

+8

कन्स्ट्रक्टर एक विधि है।आपको ऐसा क्यों लगता है कि यह नहीं है? जैसे आप इसे व्युत्पन्न वस्तु में एक निर्माता से कॉल कर सकते हैं। –

+1

@ जेम्स गौंट, क्योंकि यह कुछ भी वापस नहीं करता है, यह एक [कन्स्ट्रक्टर] है (http://en.wikipedia.org/wiki/Constructor_%28object-oriented_programming%29)। मुझे यकीन नहीं है कि यह सी # में कैसे काम करता है, लेकिन जावा में एक कन्स्ट्रक्टर के पास विधि के साथ कुछ लेना देना नहीं है सिवाय इसके कि यह कोड का एक ब्लॉक है। क्या आप इसे 'आधार() 'के साथ नहीं कहते हैं? तो यह भी यहाँ एक समस्या नहीं होनी चाहिए। –

2

क्योंकि सदस्य का नाम कक्षा के निर्माता के नाम से संघर्ष करता है?

0

यह करने के लिए एक सही तरीके से और यह करने के लिए एक गलत तरीका नहीं है:

Public Class Class1 
    Public Sub Class1() 

    End Sub 
End Class 

सी # में, आप इसे के रूप में उल्लेख।

क्यों सी # इसे अनुमति नहीं देता है?

क्योंकि ऐसा करने का कोई कारण नहीं है। आप अपने जीवन में इस तरह के भ्रम पैदा करना क्यों चाहते हैं।

मुझे लगता है कि सीएलआर इसे अनुमति देता है, क्योंकि एक और पोस्ट एक vb.net उदाहरण के साथ साबित होता है और इसे प्रतिबंधित नहीं किया जाना चाहिए, लेकिन मैं उसी नियम के आधार पर एक एप्लिकेशन नहीं बनाना चाहता हूं जो सीएलआर संचालित करता है। अमूर्तता कोड को और स्पष्ट बनाता है। मुझे लगता है कि तर्क एकाधिक विरासत के समान स्तर पर काम करता है। हाँ, यह कुछ भाषाओं में किया जा सकता है, लेकिन यह भ्रम का कारण बनता। इसलिए मेरा जवाब अस्पष्टता और भ्रम को कम करना होगा और सी # पार्सर/कंपाइलर में आधारित है। सी # टीम द्वारा एक डिजाइन पसंद।