पिछले अनुभव से मैं इस धारणा के तहत था कि यह एक पूर्ण उदाहरण पर एक्सटेंशन विधियों को कॉल करने के लिए पूरी तरह कानूनी है (हालांकि शायद सलाह नहीं दी जा सकती है)। तो सी # में, इस कोड को संकलित करता है तथा रन:यह एक्सटेंशन विधि VB.NET में NullReferenceException क्यों फेंकती है?
// code in static class
static bool IsNull(this object obj) {
return obj == null;
}
// code elsewhere
object x = null;
bool exists = !x.IsNull();
हालांकि, मैं सिर्फ एक साथ उदाहरण के कोड का एक छोटा सूट मेरे विकास टीम के अन्य सदस्यों के लिए डाल दिया गया था (हम सिर्फ .NET 3.5 और मैंने करने के लिए उन्नत हमारे पास उपलब्ध नई सुविधाओं) में से कुछ पर लाने के लिए टीम उठने का कार्य सौंपा गया है, और मैंने लिखा मैं क्या सोचा केवल खोजने के लिए कि यह वास्तव में एक NullReferenceException
फेंकता ऊपर कोड की VB.NET बराबर होती है, ।
' code in module '
<Extension()> _
Function IsNull(ByVal obj As Object) As Boolean
Return obj Is Nothing
End Function
' code elsewhere '
Dim exampleObject As Object = Nothing
Dim exists As Boolean = Not exampleObject.IsNull()
डिबगर वहीं बंद हो जाता है, के रूप में अगर मैं एक उदाहरण विधि बुलाया था: कोड मैंने लिखा इस थी। क्या मैं कुछ गलत कर रहा हूं (उदाहरण के लिए, क्या सी # और वीबी.नेट के बीच विस्तार विधि को परिभाषित करने के तरीके में कुछ सूक्ष्म अंतर है? क्या यह वास्तव में VB.NET में एक शून्य उदाहरण पर एक एक्सटेंशन विधि को कॉल करने के लिए कानूनी है, हालांकि यह सी # में कानूनी है? (मैंने सोचा होता तो यह एक नेट चीज के रूप में भाषा-विशिष्ट बात करने का विरोध किया था, लेकिन शायद मैं गलत था।)
किसी को भी मेरे लिए यह एक व्याख्या कर सकते हैं?
IsNull विधि सिर्फ एक उदाहरण है या आप वास्तव में x.IsNull उपयोग करना चाहते हैं कर रहे हैं() 'एक्स इज नथिंग' या 'x == null' के बजाय? – jrummell
@jrummell: यह सिर्फ एक उदाहरण है। जैसा कि मैंने उल्लेख किया है, मैं कुछ उदाहरण कोड लिख रहा था यह बताता हूं कि मेरे कुछ टीम सदस्यों के लिए विस्तार विधियां कैसे काम करती हैं। मैं इस विधि के लिए एक टिप्पणी शामिल करना चाहता हूं कि "आप वास्तव में विस्तार विधियों के साथ ऐसा कर सकते हैं, हालांकि मैं इसकी अनुशंसा नहीं करता हूं" - बस यह दिखाने के लिए कि कैसे एक विस्तार विधि वास्तव में एक स्थिर है (साझा किया गया है) तरीका। लेकिन फिर मैंने पाया कि मैं * वीबी में ऐसा नहीं कर सका, जिसने मुझे आश्चर्यचकित कर दिया। –
जैसा पाया गया है, यह देर से बाध्यकारी के लिए समर्थन के कारण है ... जैसे आप (दान) मुझे एहसास नहीं हुआ कि वीबी के पास देर से बाध्यकारी के लिए ऐसा समर्थन था, मुझे लगता है कि यह वीबी 6 के साथ एक संगतता की बात है। थोड़ी सी तरफ के रूप में, यदि आप अन्य डेवलपर्स के लिए कुछ मानक/प्रशिक्षण निर्धारित करने की सोच रहे हैं तो आप विकल्प सख्त को जरूरी कर सकते हैं क्योंकि मुझे लगता है कि इससे कई संभावित समस्याएं उठने में मदद मिलती है। निश्चित रूप से वाईएमएमवी। –