2008-12-08 9 views
36

क्या सी # में कक्षा के लिए नल-कोलेसिंग ऑपरेटर को ओवरराइड करना संभव है?नल-कोलेसिंग ऑपरेटर को ओवरराइड करना संभव है?

उदाहरण के लिए कहें उदाहरण के लिए मैं एक डिफ़ॉल्ट मान वापस करना चाहता हूं यदि कोई उदाहरण शून्य है और यदि यह नहीं है तो उदाहरण लौटाएं। कोड कुछ इस तरह दिखाई देगा:

return instance ?? new MyClass("Default"); 

लेकिन क्या होगा अगर मैं अशक्त-कोलेसिंग ऑपरेटर का उपयोग करने के लिए करता है, तो MyClass.MyValue सेट किया गया है भी जाँच करने के लिए चाहते हैं?

बेशक इसके लिए कोई वास्तविक आवश्यकता नहीं है (कम से कम मुझे ऐसा लगता है) - इससे पहले कि आप जवाब दें कि "आप ऐसा क्यों करना चाहते हैं" - यदि यह संभव है तो 0 उत्सुक है

+0

पैट्रिक, एक प्रयोग: मैं स्ट्रिंग के अशक्त-कोलेसिंग ऑपरेटर ओवरलोड अशक्त के रूप में खाली करने पर विचार करना चाहता था। चाहे वह समझदार हो या जो कुछ भी हो, वह एक अलग सवाल है। – ANeves

उत्तर

29

अच्छा सवाल! यह list of overloadable and non-overloadable operators में एक तरफ या किसी अन्य सूचीबद्ध नहीं है और the operator's page पर कुछ भी उल्लेख नहीं किया गया है।

public class TestClass 
{ 
    public static TestClass operator ??(TestClass test1, TestClass test2) 
    { 
     return test1; 
    } 
} 

और मैं त्रुटि "Overloadable द्विआधारी ऑपरेटर की उम्मीद" मिलती है:

तो मैं निम्नलिखित की कोशिश की। तो मैं कहूंगा कि उत्तर .NET 3.5 के रूप में है, एक संख्या।

6

सरल जवाब: नहीं

सी # डिजाइन सिद्धांतों ओवरलोडिंग भाषा की कि परिवर्तन अर्थ विज्ञान ऑपरेटर अनुमति नहीं है। इसलिए जटिल ऑपरेटर जैसे यौगिक असाइनमेंट, टर्नरी ऑपरेटर और ... को ओवरलोड नहीं किया जा सकता है।

14

ECMA-334 मानक के अनुसार, यह अधिभारित करना संभव नहीं है ?? ऑपरेटर।

इसी तरह, आप निम्नलिखित ऑपरेटरों को ओवरलोड नहीं कर सकते हैं:

  • =
  • & &
  • ||
  • :
  • जाँच
  • अनियंत्रित
  • नई
  • typeof
  • रूप
  • है
-2

किसी को भी यहाँ एक समाधान की तलाश में है, तो निकटतम उदाहरण के लिए होगा यह

return instance.MyValue != null ? instance : new MyClass("Default"); 
+2

-1: आप बिंदु खो रहे हैं, आप ओपी के कोड के साथ जो भी प्रस्तावित करते हैं वह पहले से ही कर सकते हैं ... कृपया प्रश्न को ध्यान से पढ़ें, वह यह नहीं पूछ रहा है कि यह कैसे करना है, लेकिन अगर नल-कोलेसिंग ऑपरेटर को अधिभारित करना संभव है - दुर्भाग्य से, जो नहीं है। – ANeves

+0

मुझे समझ में आता है कि वह ओवरलोडिंग के बारे में पूछ रहा था ?? ऑपरेटर और मैंने प्रतिक्रियाओं को पढ़ा कि यह असंभव था। इसलिए मैं केवल एक समाधान प्रदान कर रहा था जो अपेक्षित परिणाम के साथ काम करता है (माना जाता है कि यह ऑपरेटर का उपयोग नहीं करता है) जो इस पृष्ठ पर आने वाले किसी भी चीज़ की तलाश में हो सकता है। – soniiic

+1

+1: क्योंकि यह प्रासंगिक है और यह स्पष्ट रूप से बताता है कि यह वास्तविक उत्तर नहीं है लेकिन एक करीबी उदाहरण – Jaap

2

यह सी # के अगले संस्करण का हिस्सा होने की अफवाह है। http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

7. से Monadic अशक्त जाँच

गुण या तरीकों एक्सेस करने से पहले nulls के लिए जांच की जरूरत को निकालता है। ग्रोवी में सुरक्षित नेविगेशन ऑपरेटर के रूप में जाना जाता है)।

पहले

if (points != null) { 
    var next = points.FirstOrDefault(); 
    if (next != null && next.X != null) return next.X; 
} 
return -1; 

बाद

var bestValue = points?.FirstOrDefault()?.X ?? -1; 
संबंधित मुद्दे