VS2015 बिल्ड डायनामिक के साथ कोई त्रुटि संदेश के साथ विफल रहता है


136

मैं कोड के एक टुकड़े पर एक यूनिट टेस्ट लिख रहा था जो 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);
रॉन बेयर

@RonBeyer हाँ मैंने उन दोनों को आज़माया था, न कि किस्मत को।
DLeh

एक और ... Assert.IsTrue((bool)asDynamic.someValue);?
रॉन बेयर

1
परीक्षण विधियों में गतिशील का उपयोग करने की कोशिश करते हुए मुझे वीएस2015 में भी यही मुद्दा मिला। बिल्ड बिना किसी त्रुटि के विफल हो गया। और Microsoft.CSharp संदर्भ जोड़ने के बाद बिल्ड सफल रहा।
सारथ रचुरी

जवाबों:


226

एक कंपाइलर त्रुटि है, Visual Studio 2015 बस त्रुटि को ठीक से रिपोर्ट नहीं करता है। हालाँकि, Visual Studio 2013 करता है:

इसका उत्तर यहां दिया गया है: https://stackoverflow.com/a/13568247 :

संक्षेप में:

dynamicइस तरह का उपयोग करने के लिए Microsoft.CSharp का संदर्भ जोड़ें ।


9
संकलित समय त्रुटि को फेंक नहीं है, Microsoft.CSharpभले ही dll संदर्भ जोड़ें using Microsoft.CSharp;
बैरी गुवेंकाया

45
.NET कोर के साथ Microsoft.CSharpइसके बजाय NuGet पैकेज जोड़ें ।
बार्ट वर्कोइजेन

6
.Net मानक आधारित क्लास लाइब्रेरी के लिए भी यही है - NuGet पैकेज Microsoft.CSharp जोड़ें।
होंग

50

जैसा कि दो लोगों ने टिप्पणियों में नोट किया है, नेट कोर और नेटस्ट्रीम के लिए, यह समस्या कभी-कभी नूगेट संदर्भ को जोड़कर तय की जाती है Microsoft.CSharp


3
यह एक परियोजना को .NET मानक में परिवर्तित करने के बाद मेरी समस्या को हल कर दिया, धन्यवाद!
जोकिम स्कॉग

1
एक एक्सेल शीट को जोड़ने वाली SSIS स्क्रिप्ट के साथ Ditto।
स्टीवकेव

@JoakimSkoog ... मुझे एक .NET मानक परियोजना (कभी नहीं परिवर्तित) पर यह समस्या थी और अभी भी मैन्युअल रूप से एक संदर्भ में जोड़ना पड़ा।
ebol2000

1

इस मुद्दे को .net 3.0 परियोजना में Newtonsoft.json के साथ संयोजन में डायनामिक कीवर्ड का उपयोग करके किया गया था।

फिक्स डायनेमिक को पूरी तरह से छोड़ना और इसके बजाय जोबजेक्ट का उपयोग करना था:

से

dynamic locales = JObject.Parse(this.Locales);

सेवा

JObject locales = JObject.Parse(this.Locales);

0

त्रुटि सूची में दिखाई नहीं देने वाली बिल्ड त्रुटियों के साथ एक ज्ञात समस्या है। उदाहरण के लिए, https://github.com/dotnet/roslyn/issues/4567 देखें

इसके चारों ओर काम करने के लिए, "त्रुटि सूची" विंडो में, "संदेश" के दाईं ओर पुलडाउन मेनू का चयन करें और "बिल्ड + इंटेलीजेंसी" चुनें।


0

मेरे पास एक समान मुद्दा था और केवल एक चीज जो इसे हल करती थी वह था मेरे NUnit पैकेज को नवीनतम संस्करण में अपग्रेड करना।

वैसे जब आप Nuget विंडो खोलते हैं, तो सुनिश्चित करें कि आपका अपने पैकेज को अपग्रेड नहीं कर रहा है (जब मेरे पास संस्करण 2.0.11 था, तो उसने मुझे संस्करण 2.0.9 में अपग्रेड करने के लिए दिखाया जो वास्तव में डाउनग्रेड हो रहा है ...)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.