मैंने सशर्त तार्किक संचालकों पर 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?अप्रासंगिक है। (बेशक, यह एक पूर्ण उत्तर नहीं है, केवल एक कीटाणु।)