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.