Koşullu mantıksal işleçler hakkında || ve &&aynı zamanda kısa devre yapan mantıksal işleçler olarak da bilinen C # Dil Belirtimini okudum . Bana göre bunların nullable booleanlar için var olup olmadığı belirsiz görünüyordu, yani işlenen türü Nullable<bool>(ayrıca yazılmıştır bool?), bu yüzden dinamik olmayan yazımla denedim:
bool a = true;
bool? b = null;
bool? xxxx = b || a; // compile-time error, || can't be applied to these types
Bu soruyu çözüyor gibiydi (Spesifikasyonu net bir şekilde anlayamadım, ancak Visual C # derleyicisinin uygulanmasının doğru olduğunu varsayarsak, şimdi biliyordum).
Ancak ben dynamicde ciltlemeyi denemek istedim . Ben de bunu denedim:
static class Program
{
static dynamic A
{
get
{
Console.WriteLine("'A' evaluated");
return true;
}
}
static dynamic B
{
get
{
Console.WriteLine("'B' evaluated");
return null;
}
}
static void Main()
{
dynamic x = A | B;
Console.WriteLine((object)x);
dynamic y = A & B;
Console.WriteLine((object)y);
dynamic xx = A || B;
Console.WriteLine((object)xx);
dynamic yy = A && B;
Console.WriteLine((object)yy);
}
}
Şaşırtıcı sonuç, bunun istisnasız çalışmasıdır.
Eh, xve yşaşırtıcı değildir, onların beyanlar hem özellikleri alındığını yol ve elde edilen değerler beklendiği gibi olan xbir trueve ybir null.
Ama için değerlendirme xxarasında A || Bhiçbir bağlayıcı zamanlı istisna kurşun ve sadece mülkiyet Adeğil, okundu B. Bu neden oluyor? BAnlayabileceğiniz gibi "Hello world", alıcıyı çılgın bir nesneye döndürmek için değiştirebiliriz ve xxyine de truebağlama problemleri olmadan değerlendirebiliriz ...
Değerlendirilmesi A && B(için yy) ayrıca bağlanma süresi hatasına yol açmaz. Ve burada elbette her iki mülk de alınır. Çalışma zamanı bağlayıcı buna neden izin veriyor? Gönderilen nesne B"kötü" bir nesneye (a gibi string) değiştirilirse, bir bağlama istisnası oluşur.
Bu doğru davranış mı? (Spesifikasyondan bunu nasıl çıkarabilirsin?)
Eğer denerseniz Bilk işlenen olarak, hem B || Ave B && A(çalışma zamanı bağlayıcı istisna vermek B | Ave B & Aher şeyi olmayan kısa devre operatörleri ile normaldir olarak çalışma cezası |ve &).
(Visual Studio 2013'ün C # derleyicisi ve .NET 4.5.2 çalışma zamanı sürümü ile denendi.)
Nullable<Boolean>dahil olma durumu yoktur , yalnızca kutulu boole'lar olarak değerlendirilirdynamic- ile yaptığınız testinbool?ilgisi yoktur. (Elbette, bu tam bir cevap değil, sadece bir tanesi.)