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 dynamic
untuk 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
Build berhasil ketika saya mengomentari pernyataan tersebut:
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 dynamic
tidak 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:
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.
sumber
dynamic asDynamic = (dynamic)obj;
? Atau hanya di Assertion, komentari dinamika dan tulisAssert.IsTrue(((dynamic)obj).someValue);
.Assert.IsTrue((bool)asDynamic.someValue);
?Jawaban:
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:
sumber
Microsoft.CSharp
dll meskipunusing Microsoft.CSharp;
tidak menimbulkan kesalahan waktu kompilasi.Microsoft.CSharp
sebagai gantinya.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
.sumber
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);
sumber
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".
sumber
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 ...)
sumber