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 dynamic
de 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, x
ve y
şaşırtıcı değildir, onların beyanlar hem özellikleri alındığını yol ve elde edilen değerler beklendiği gibi olan x
bir true
ve y
bir null
.
Ama için değerlendirme xx
arasında A || B
hiçbir bağlayıcı zamanlı istisna kurşun ve sadece mülkiyet A
değil, okundu B
. Bu neden oluyor? B
Anlayabileceğiniz gibi "Hello world"
, alıcıyı çılgın bir nesneye döndürmek için değiştirebiliriz ve xx
yine de true
bağ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 B
ilk işlenen olarak, hem B || A
ve B && A
(çalışma zamanı bağlayıcı istisna vermek B | A
ve B & A
her ş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.)