VS2015 build gagal tanpa pesan kesalahan dengan Dynamic

136

Saya sedang menulis tes unit pada sepotong kode yang mengembalikan JSON. Jenis yang dikembalikannya adalah jenis anonim, jadi saya berpikir untuk memverifikasi nilai di atasnya, saya baru saja memasukkan objek ke a dynamicuntuk melakukan pernyataan saya.

Namun, ketika saya melakukannya, build saya gagal tetapi saya tidak memiliki pesan kesalahan apa pun. Saya dapat mereproduksi ini dengan kode yang sangat sederhana dalam Proyek Uji Unit baru:

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

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

Lihat di bawah untuk tangkapan layar dari build yang gagal

membangun gagal

Build berhasil ketika saya mengomentari pernyataan tersebut:

membangun kesuksesan tanpa menegaskan

Sebaliknya, saya menjalankan kode berikut di LinqPad 5 beta (yang menggunakan kompiler Roslyn) dan tidak memiliki masalah:

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

Benar

Apa yang terjadi di sini? Karena kesalahan tidak muncul, saya tidak tahu apakah saya menggunakan secara dynamictidak benar, atau jika tidak dapat menemukan kelebihan beban untuk digunakan IsTrue()karena dynamic, atau jika ini adalah bug dalam kompiler (meskipun saya sangat meragukan ini , Saya tidak memiliki bukti bahwa ada yang salah dengan kode saya).

Mengenai masalah kelebihan beban, saya mencoba Assert.IsTrue((bool)asDynamic.someValue);tetapi build masih gagal, masih tidak ada pesan kesalahan.

Sesuai komentar @RonBeyer, saya juga telah mencoba lebih banyak casting seperti di bawah ini tetapi tidak berhasil:

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

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

Setelah diperiksa lebih dekat, saya menemukan bahwa ada kesalahan yang tercantum di jendela Keluaran:

c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): kesalahan CS0656: Anggota yang tidak ada kompiler 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Oke, VS2013 lebih baik dalam melaporkan kesalahan, saya akan mencari berdasarkan itu:

masukkan deskripsi gambar di sini

Oke, menambahkan referensi ke Microsoft.CSharp memperbaiki kesalahan pembuatan , tetapi saya akan membiarkan pertanyaan ini terbuka karena mungkin masalah dengan VS2015 yang (dalam pikiran saya) harus diselesaikan.

DLeh
sumber
Apakah Anda yakin ini benar-benar kegagalan kompilasi daripada kegagalan tautan?
David W
Dapatkah Anda mencoba dynamic asDynamic = (dynamic)obj;? Atau hanya di Assertion, komentari dinamika dan tulis Assert.IsTrue(((dynamic)obj).someValue);.
Ron Beyer
@RonBeyer ya saya sudah mencoba keduanya juga, bukan keberuntungan.
DLeh
Satu lagi ... Assert.IsTrue((bool)asDynamic.someValue);?
Ron Beyer
1
Saya menghadapi masalah yang sama di VS2015 ketika mencoba menggunakan dinamika dalam metode pengujian. Build gagal tanpa kesalahan apa pun. Dan setelah menambahkan referensi Microsoft.CSharp, build berhasil.
Sarath Rachuri

Jawaban:

226

Ada kesalahan kompiler, Visual Studio 2015 tidak melaporkan kesalahan dengan benar. Namun, Visual Studio 2013 tidak:

Ini dijawab di sini: https://stackoverflow.com/a/13568247 :

Pendeknya:

Tambahkan referensi ke Microsoft.CSharp untuk menggunakan dynamicseperti ini.

DLeh
sumber
9
Tambahkan referensi ke Microsoft.CSharpdll meskipun using Microsoft.CSharp;tidak menimbulkan kesalahan waktu kompilasi.
Baz Guvenkaya
45
Dengan .NET Core tambahkan paket NuGet Microsoft.CSharpsebagai gantinya.
Bart Verkoeijen
6
Hal yang sama untuk perpustakaan kelas berbasis .Net Standar - tambahkan paket NuGet Microsoft.CSharp.
Hong
50

Seperti yang telah dicatat oleh dua orang dalam komentar, untuk Net Core dan NetStandard, masalah ini terkadang diperbaiki dengan menambahkan referensi NuGet ke Microsoft.CSharp.

Nicholas Petersen
sumber
3
Ini memecahkan masalah saya setelah mengubah proyek ke .NET Standard, terima kasih!
Joakim Skoog
1
Ditto dengan skrip SSIS menambahkan lembar excel.
SteveCav
@ JoakimSkoog ... Saya mengalami masalah ini pada proyek .NET Standard (tidak pernah dikonversi) dan masih harus menambahkan referensi secara manual.
ebol2000
1

Apakah masalah ini menggunakan kata kunci dinamis yang dikombinasikan dengan Newtonsoft.json dalam proyek .net 3.0.

Perbaikannya adalah dengan menjatuhkan dinamika sama sekali dan menggunakan JObject sebagai gantinya:

dari

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

untuk

JObject locales = JObject.Parse(this.Locales);
Dan Ochiana
sumber
0

Ada masalah umum dengan kesalahan versi yang tidak muncul dalam daftar kesalahan. Lihat, misalnya, https://github.com/dotnet/roslyn/issues/4567 .

Untuk mengatasinya, di jendela "Daftar Kesalahan", pilih menu tarik-turun di sebelah kanan "Pesan" dan pilih "Build + IntelliSense".

Neal Gafter
sumber
0

Saya memiliki masalah serupa dan satu-satunya hal yang menyelesaikannya bagi saya adalah meningkatkan paket NUnit saya ke versi terbaru.

Ngomong-ngomong, ketika Anda membuka jendela Nuget pastikan bahwa Anda tidak menurunkan paket Anda (ketika saya memiliki versi 2.0.11 itu menunjukkan saya untuk meningkatkan ke versi 2.0.9 yang sebenarnya menurunkan ...)

perak
sumber