मैंने सशर्त तार्किक संचालकों पर C # भाषा विनिर्देशन पढ़ा ||
और &&
, जिसे लघु-संचारी तार्किक संचालकों के रूप में भी जाना जाता है। अगर यह अशक्त बूलियन के लिए अस्तित्व में है, तो मुझे यह अस्पष्ट लग रहा था, अर्थात ऑपरेंड प्रकार Nullable<bool>
(भी लिखा हुआ bool?
), इसलिए मैंने इसे गैर-गतिशील टाइपिंग के साथ आज़माया:
bool a = true;
bool? b = null;
bool? xxxx = b || a; // compile-time error, || can't be applied to these types
यह सवाल सुलझता हुआ लग रहा था (मैं विनिर्देश को स्पष्ट रूप से नहीं समझ सकता था, लेकिन विज़ुअल सी # कंपाइलर का कार्यान्वयन सही था, अब मुझे पता था)।
हालांकि, मैं dynamic
बंधन के साथ भी कोशिश करना चाहता था । इसलिए मैंने इसके बजाय यह कोशिश की:
static class Program
{
static dynamic A
{
get
{
Console.WriteLine("'A' evaluated");
return true;
}
}
static dynamic B
{
get
{
Console.WriteLine("'B' evaluated");
return null;
}
}
static void Main()
{
dynamic x = A | B;
Console.WriteLine((object)x);
dynamic y = A & B;
Console.WriteLine((object)y);
dynamic xx = A || B;
Console.WriteLine((object)xx);
dynamic yy = A && B;
Console.WriteLine((object)yy);
}
}
आश्चर्यजनक परिणाम यह है कि यह बिना किसी अपवाद के चलता है।
ठीक है, x
और y
आश्चर्य की बात नहीं है, उनकी घोषणाएं दोनों गुणों को पुनः प्राप्त करने की ओर ले जाती हैं, और परिणामस्वरूप मान अपेक्षित हैं, x
है true
और y
है null
।
लेकिन बिना किसी बाध्यकारी समय के अपवाद xx
के A || B
नेतृत्व का मूल्यांकन , और केवल संपत्ति A
को पढ़ा गया था, नहीं B
। क्यों होता है ऐसा? जैसा कि आप बता सकते हैं, हम B
एक पागल वस्तु को वापस करने के लिए गेट्टर बदल सकते हैं , जैसे "Hello world"
, और xx
अभी भी true
बाध्यकारी-समस्याओं के बिना मूल्यांकन करेंगे ...
मूल्यांकन A && B
(के लिए yy
) भी कोई बाध्यकारी समय त्रुटि की ओर जाता है। और यहाँ दोनों गुणों को पुनः प्राप्त किया जाता है, निश्चित रूप से। रन-टाइम बाइंडर द्वारा इसकी अनुमति क्यों दी गई है? यदि दी गई वस्तु को B
"खराब" ऑब्जेक्ट (जैसे string
) में बदल दिया जाता है , तो एक बाध्यकारी अपवाद उत्पन्न होता है।
क्या यह सही व्यवहार है? (आप कल्पना से कैसे अनुमान लगा सकते हैं?)
यदि आप B
पहले ऑपरेंड के रूप में कोशिश करते हैं , दोनों B || A
और B && A
रनटाइम बाइंडर अपवाद देते हैं ( B | A
और B & A
ठीक काम करते हैं क्योंकि गैर-शॉर्ट-सर्कुलेटिंग ऑपरेटरों के साथ सब कुछ सामान्य है |
और &
)।
(दृश्य स्टूडियो 2013 के C # संकलक के साथ प्रयास किया गया, और रनटाइम संस्करण .NET 4.5.2।)
Nullable<Boolean>
बिल्कुल भी शामिल नहीं हैं , केवल बॉक्स वाले बूलियन के रूप में इलाज किया जाता हैdynamic
- आपका परीक्षणbool?
अप्रासंगिक है। (बेशक, यह एक पूर्ण उत्तर नहीं है, केवल एक कीटाणु।)