मैं कोड के एक टुकड़े पर एक यूनिट टेस्ट लिख रहा था जो JSON को लौटाता था। जिस प्रकार यह रिटर्न करता है वह एक गुमनाम प्रकार है, इसलिए मैंने सोचा कि मैं इस पर मूल्यों को सत्यापित करूं, मैं सिर्फ dynamic
अपने दावे को करने के लिए ऑब्जेक्ट डालूंगा।
हालाँकि, जब मैं ऐसा करता हूं, तो मेरा निर्माण विफल हो जाता है लेकिन मेरे पास कोई त्रुटि संदेश नहीं है। मैं एक नए यूनिट टेस्ट प्रोजेक्ट में बहुत ही सरल कोड के साथ इसे पुन: पेश करने में सक्षम था:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
निर्माण विफल होने के स्क्रीनशॉट के लिए नीचे देखें
बिल्ड तब सफल होता है जब मैं इस पर टिप्पणी करता हूं:
इसके विपरीत, मैंने LinqPad 5 बीटा में निम्नलिखित कोड चलाया (जो रोसलिन कंपाइलर का उपयोग करता है) और इसमें कोई समस्या नहीं थी:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
सच
यहाँ क्या चल रहा है? चूंकि त्रुटि दिखाई नहीं दे रही है, अगर मैं dynamic
गलत तरीके से उपयोग कर रहा हूं , तो मैं यह नहीं बता सकता हूं कि क्या इसकी IsTrue()
वजह से उपयोग करने के लिए अधिभार नहीं मिल सकता है dynamic
, या यदि यह कंपाइलर में एक बग है (हालांकि मुझे इस पर अत्यधिक संदेह है , मेरे पास कोई सबूत नहीं है कि मेरे कोड में कुछ गड़बड़ है)।
अधिभार मुद्दे के बारे में, मैंने कोशिश की Assert.IsTrue((bool)asDynamic.someValue);
लेकिन बिल्ड अभी भी विफल रहता है, फिर भी कोई त्रुटि संदेश नहीं है।
@ रॉनबीयर की टिप्पणी के अनुसार, मैंने भी अधिक कास्टिंग करने की कोशिश की थी जैसे नीचे कोई फायदा नहीं हुआ:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
करीब से निरीक्षण करने पर, मैंने पाया कि आउटपुट विंडो में एक त्रुटि सूचीबद्ध थी:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): त्रुटि CS0656: लापता संकलक के लिए आवश्यक सदस्य 'Microsoft.CSharp.RuntimeBinder.CSharp.gugumentInfo.Create'
ठीक है, VS2013 त्रुटियों की रिपोर्ट करने में बेहतर है, मैं उन पर आधारित खोज करूंगा:
ठीक है, Microsoft.CSharp के लिए एक संदर्भ जोड़कर बिल्ड त्रुटि को ठीक किया गया है , लेकिन मैं इस प्रश्न को खुला छोड़ दूंगा क्योंकि यह संभवतः VS2015 के साथ एक मुद्दा है जिसे (मेरे दिमाग में) हल किया जाना चाहिए।
dynamic asDynamic = (dynamic)obj;
? या सिर्फ अभिकथन में, डायनामिक टिप्पणी करें और लिखें Assert.IsTrue(((dynamic)obj).someValue);
।
Assert.IsTrue((bool)asDynamic.someValue);
?