VS2015 derlemesi Dynamic ile hata mesajı vermeden başarısız oluyor


136

JSON döndüren bir kod parçası üzerinde birim testi yazıyordum. Döndürdüğü tür anonim bir tür, bu yüzden değerlerini doğrulamayı düşündüm, sadece dynamiciddialarımı yapmak için nesneyi atarım.

Ancak, bunu yaptığımda, derleme başarısız ama herhangi bir hata iletileri yok. Bunu yeni bir Birim Test Projesinde çok basit bir kodla çoğaltabildim:

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

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

Derleme başarısız bir ekran görüntüsü için aşağıya bakın

inşa başarısız

Olsa da iddiayı yorumlamak yapı başarılı:

iddia olmadan başarılı inşa etmek

Buna karşılık, LinqPad 5 beta'da (Roslyn derleyicisini kullanan) aşağıdaki kodu çalıştırdım ve hiçbir sorun yaşamadım:

var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());

Doğru

Burada neler oluyor? Hata gösterilmediğinden dynamic, yanlış kullanıp kullanmadığımı veya IsTrue()nedeniyle kullanmak için aşırı yükü bulamıyorsa dynamicveya derleyicide bir hata ise (çok şüphe duymama rağmen) söyleyemem , Kodumda bir sorun olduğunu gösteren hiçbir kanıtım yok).

Aşırı yükleme sorunuyla ilgili olarak, denedim Assert.IsTrue((bool)asDynamic.someValue);ama yapı hala başarısız, hala hata mesajı yok.

@ RonBeyer yorum başına, ben de boşuna aşağıdaki gibi daha fazla döküm denedim:

    dynamic asDynamic = (dynamic)obj;
    Assert.IsTrue(((dynamic)asDynamic).someValue);

    Assert.IsTrue((bool)asDynamic.somevalue);

Daha yakından incelendiğinde, Çıktı penceresinde bir hata olduğunu gördüm:

c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): hata CS0656: Eksik derleyici gerekli üye 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Tamam, VS2013 hataları bildirmede daha iyidir, bunlara göre arama yapacağım:

resim açıklamasını buraya girin

Tamam, Microsoft.CSharp'a bir başvuru ekleyerek derleme hatası düzeltildi , ancak bu soruyu açık bırakacağım çünkü muhtemelen VS2015 ile ilgili bir sorun (aklımda) çözülmesi gerekiyor.


Bunun bir bağlantı hatası yerine derleme hatası olduğundan emin misiniz?
David W

Deneyebilir dynamic asDynamic = (dynamic)obj;misin? Ya da sadece İddia'da, dinamiği yorumlayın ve yazın Assert.IsTrue(((dynamic)obj).someValue);.
Ron Beyer

@RonBeyer evet İkisini de denedim, şans değil.
DLeh

Bir tane daha ... Assert.IsTrue((bool)asDynamic.someValue);?
Ron Beyer

1
Test yöntemlerinde dinamik kullanmaya çalışırken VS2015'te de aynı sorunla karşılaştım. Derleme hatasız olarak başarısız oldu. Ve Microsoft.CSharp başvurusu eklendikten sonra derleme başarılı oldu.
Sarath Rachuri

Yanıtlar:


226

Derleyici hatası var, Visual Studio 2015 hatayı düzgün raporlamıyor. Ancak, Visual Studio 2013 şunları yapar:

Buraya şu cevap verilir: https://stackoverflow.com/a/13568247 :

Kısacası:

dynamicBu şekilde kullanmak için Microsoft.CSharp'a bir başvuru ekleyin .


9
Derleme zamanı hatası Microsoft.CSharpatmasa bile dll'ye başvuru ekleyin using Microsoft.CSharp;.
Barry Güvenkaya

45
.NET Core ile Microsoft.CSharpbunun yerine NuGet paketini ekleyin .
Bart Verkoeijen

6
Aynı .Net Standard tabanlı sınıf kütüphanesi için - NuGet paketini Microsoft.CSharp ekleyin.
Hong

50

Yorumlarda iki kişinin belirttiği gibi, Net Core ve NetStandard için bu sorun bazen bir NuGet referansı eklenerek giderilir Microsoft.CSharp.


3
Bu, bir projeyi .NET Standard'a dönüştürdükten sonra sorunumu çözdü, teşekkürler!
Joakim Skoog

1
Excel sayfası ekleyen bir SSIS komut dosyası ile Ditto.
SteveCav

@JoakimSkoog ... Bu sorunu bir .NET Standard projesinde (hiç dönüştürülmemiş) yaşadım ve yine de el ile bir başvuru eklemek zorunda kaldım.
ebol2000

1

Bu sorun, bir .net 3.0 projesinde Newtonsoft.json ile birlikte dinamik anahtar sözcük kullanma sorunu yaşadı.

Düzeltme, dinamik olarak tamamen bırakmak ve bunun yerine JObject kullanmaktı:

itibaren

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

için

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

0

Hata listesinde görünmeyen derleme hatalarıyla ilgili bilinen bir sorun var. Bkz . Örneğin, https://github.com/dotnet/roslyn/issues/4567 .

Bu sorunu gidermek için, "Hata Listesi" penceresinde, "İletiler" in sağ tarafındaki açılır menüyü ve "Derleme + IntelliSense" i seçin.


0

Benzer bir sorunum vardı ve bana çözen tek şey NUnit paketimi en son sürüme yükseltmekti.

Bu arada, Nuget penceresini açtığınızda, paketinizi indirmediğinizden emin olun (2.0.11 sürümünü aldığımda, aslında indirilen 2.0.9 sürümüne yükseltmemi gösterdi ...)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.