ডায়ামিক সহ কোনও ত্রুটি বার্তা না দিয়ে ভিএস2015 বিল্ড ব্যর্থ হয়


136

আমি কোডের টুকরোতে একটি ইউনিট পরীক্ষা লিখছিলাম যা জেএসএনকে ফিরিয়ে দিয়েছে। এটি যে ধরণের প্রত্যাবর্তন করে তা একটি বেনামি প্রকার, তাই আমি এতে মানগুলি যাচাই করার জন্য ভেবেছিলাম আমি কেবলমাত্র dynamicআমার বক্তব্যগুলি করতে একটিতে বস্তুটি ফেলে দেব।

যাইহোক, আমি যখন এটি করি তখন আমার বিল্ডটি ব্যর্থ হয় তবে আমার কোনও ত্রুটির বার্তা নেই। আমি একটি নতুন ইউনিট পরীক্ষা প্রকল্পে খুব সাধারণ কোড দিয়ে এটি পুনরুত্পাদন করতে সক্ষম হয়েছি:

[TestMethod]
public void TestMethod1()
{
    var obj = new { someValue = true };

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

বিল্ড ব্যর্থতার স্ক্রিনশটের জন্য নীচে দেখুন

বিল্ডিং ব্যর্থ

যদিও আমি দৃ as়তার সাথে মন্তব্যটি মন্তব্য করি তখন বিল্ডটি সফল হয়:

দৃ without়তা ছাড়াই সফল নির্মাণ

বিপরীতে, আমি লিনকপ্যাড 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);

কাছাকাছি পরিদর্শন করার পরে, আমি খুঁজে পেয়েছি আউটপুট উইন্ডোতে তালিকাভুক্ত একটি ত্রুটি ছিল:

সি: ... yn ডায়নামিকবিল্ডফেইল টেস্ট \ ইউনিটটেষ্ট ১.সি (16,33,16,42): ত্রুটি CS0656: অনুপস্থিত সংকলক প্রয়োজন সদস্য 'মাইক্রোসফ্ট.সিএসআরপ.রুনটাইমবাইন্ডার.সিএসআরএপিআরগমেন্টআইএনফো। ক্রিয়েট'

ঠিক আছে, ভিএস2013 ত্রুটিগুলি রিপোর্ট করা আরও ভাল, আমি এর উপর ভিত্তি করে অনুসন্ধান করব:

এখানে চিত্র বর্ণনা লিখুন

ঠিক আছে, মাইক্রোসফ্টের একটি রেফারেন্স যুক্ত করুন CS


আপনি কি নিশ্চিত যে এটি লিঙ্ক ব্যর্থতার চেয়ে আসলে একটি সংকলন ব্যর্থতা?
ডেভিড ডব্লিউ

আপনি চেষ্টা করতে পারেন dynamic asDynamic = (dynamic)obj;? বা কেবল দৃ in়তার মধ্যে, গতিশীল মন্তব্য করুন এবং লিখুন Assert.IsTrue(((dynamic)obj).someValue);
রন বায়ার

@ রনবায়ার হ্যাঁ, আমি দু'জনেরও চেষ্টা করেছিলাম, ভাগ্য নয়।
ডিএলহহ

আরও একটি ... Assert.IsTrue((bool)asDynamic.someValue);?
রন বায়ার

1
পরীক্ষার পদ্ধতিগুলিতে গতিশীল ব্যবহার করার চেষ্টা করার সময় আমি ভিএস ২০১৫ এ একই সমস্যার মুখোমুখি হয়েছিলাম। বিল্ডটি কোনও ত্রুটি ছাড়াই ব্যর্থ হয়েছিল। এবং মাইক্রোসফ্ট.সিএসআরপ রেফারেন্স যুক্ত করার পরে বিল্ডটি সফল হয়েছে।
সারথ রাচুরি

উত্তর:


226

একটি সংকলক ত্রুটি রয়েছে, ভিজ্যুয়াল স্টুডিও 2015 ঠিক ত্রুটিটি সঠিকভাবে প্রতিবেদন করে না। তবে, ভিজ্যুয়াল স্টুডিও 2013 করে:

এটির উত্তর এখানে দেওয়া হয়েছে: https://stackoverflow.com/a/13568247 :

সংক্ষেপে:

এটি ব্যবহার করার জন্য মাইক্রোসফ্ট.সিএসআর্পে একটি রেফারেন্স যুক্ত করুন dynamic


9
একটি কম্পাইল সময় ত্রুটি নিক্ষেপ না Microsoft.CSharpকরেও dll এ রেফারেন্স যুক্ত করুন using Microsoft.CSharp;
ব্যারি গুভেনকায়া

45
সঙ্গে .NET কোর NuGet প্যাকেজ জুড়ুন Microsoft.CSharpপরিবর্তে।
বার্ট ভেরকোইজেন

6
নেট স্ট্যান্ডার্ড ভিত্তিক ক্লাস লাইব্রেরির জন্য একই - নুগেট প্যাকেজ মাইক্রোসফ্ট.সিএসআরপ যোগ করুন।
হং

50

দু'জন ব্যক্তি মন্তব্য হিসাবে উল্লেখ করেছেন যে নেট কোর এবং নেট স্ট্যান্ডার্ডের জন্য, এই সমস্যাটি মাঝে মধ্যে একটি নিউগেট রেফারেন্স যুক্ত করে সংশোধন করা হয় Microsoft.CSharp


3
প্রকল্পটি। নেট স্ট্যান্ডার্ডে রূপান্তর করার পরে এটি আমার সমস্যার সমাধান করেছে, আপনাকে ধন্যবাদ!
জোয়াকিম স্কুগ

1
একটি এসএসআইএস স্ক্রিপ্ট সহ ডিট্টো একটি এক্সেল শিট যুক্ত করুন।
স্টিভক্যাভ

@ জোয়াকিমস্কুগ ... একটি নেট। স্ট্যান্ডার্ড প্রকল্পে আমার কখনও সমস্যা ছিল (কখনও রূপান্তরিত হয়নি) এবং ম্যানুয়ালি একটি রেফারেন্স যোগ করতে হয়েছিল।
ebol2000

1

একটি নেট নেট প্রকল্পে নিউটোনসফট.জসনের সাথে ডায়নামিক কীওয়ার্ড ব্যবহার করে এই সমস্যাটি ছিল।

সমাধানটি ছিল ডায়নামিক পুরোপুরি ছেড়ে দেওয়া এবং পরিবর্তে JObject ব্যবহার করা:

থেকে

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

প্রতি

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

0

বিল্ড ত্রুটিগুলি ত্রুটি তালিকায় উপস্থিত না হওয়ার সাথে একটি ज्ञিত সমস্যা রয়েছে। উদাহরণস্বরূপ, https://github.com/dotnet/roslyn/issues/4567 দেখুন

এটির চারপাশে কাজ করার জন্য, "ত্রুটি তালিকা" উইন্ডোতে, "বার্তা" এর ডানদিকে টান ডাউন মেনুটি নির্বাচন করুন এবং "বিল্ড + ইনটেলিসেন্স" নির্বাচন করুন।


0

আমার অনুরূপ সমস্যা ছিল এবং আমার কাছে এটি সমাধান করার একমাত্র জিনিসটি ছিল আমার নুনিট প্যাকেজটি সর্বশেষ সংস্করণে আপগ্রেড করা।

যাইহোক আপনি যখন নুগেট উইন্ডোটি খুলবেন তখন নিশ্চিত হয়ে নিন যে আপনার প্যাকেজটি আপনার ডাউনগ্রেড না করা হয়েছে (যখন আমার 2.0.0.1 সংস্করণ ছিল এটি আমাকে 2.0.0 সংস্করণে আপগ্রেড করতে দেখিয়েছিল যা আসলে ডাউনগ্রেডিং ...)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.