Kısa devre operatörleri null Boolean değerleri için || ve && var mı? Bu RuntimeBinder bazen öyle düşünüyor
C okudum# Dil BelirtimiKoşullu mantıksal operatörler||
&&
, Ayrıca kısa devre mantıksal operatörler olarak bilinir. Bana bu null Boolean değerleri için dinamik olmayan daktilo ile çalıştım, yani işlenen türü Nullable<bool>
(bool?
yazılı), var olup olmadığı belli gibiydi:
bool a = true;
bool? b = null;
bool? xxxx = b || a; // compile-time error, || can't be applied to these types
Sorunun çözümü için görünen (belirtimi açıkça anlayamadım, ama Visual C uygulanması varsayarak# derleyici doğru olduğunu şimdi anladım).
Ancak, dynamic
ile de bağlayıcı denemek istedim. Bunun yerine çalıştım:
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ç bu istisnasız olarak çalışır.
Ä°yi, x
y
şaşırtıcı değil, onların tanımlamalar liderlik özellikleri hem de alınan olmak, ve elde edilen değerlerdir beklendiği gibi, x
true
y
null
.
Ama A || B
xx
değerlendirme bağlama zamanı bir istisna neden ve özelliği A
okundu sadece B
değil. Peki neden böyle oluyor? Olarak anlat, biz değişebilir B
alıcı dönmek çılgın bir nesne gibi "Hello world"
xx
hala deÄŸerlendirmek true
baÄŸlama-sorunlar...
A && B
(yy
) değerlendirilmesi de bağlama zamanı hata yol açar. Ve burada her iki özellik, tabii ki alınır. Neden bu çalıştırma cilt tarafından izin verilir? Eğer B
döndürülen nesne için "kötü" nesne (string
gibi), bağlayıcı bir durum ortaya çıkar. değişirse
Bu doğru bir davranış mı?(Nasıl spektrometresi olduğunu iddia edebilir misiniz?)
EÄŸer deneyin B
ilk iÅŸlenen, her iki B || A
B && A
ver zamanı binder istisna (B | A
B & A
iş Tamam gibi her şey normal olmayan kısa-devre operatörleri |
&
).
(C ile çalıştı# Visual Studio 2013 derleyici ve çalışma zamanı sürümü .NET 4.5.2.)
CEVAP
Her şeyden önce, spec olmayan dinamik konusunda net olmadığını belirttiğin için teşekkürler null bool durum. Bir sonraki sürümünde bunu düzeltebilirim. Derleyicinin davranışı istenen davranış; &&
||
null bools üzerinde çalışmak gerekiyor.
Dinamik cilt bu kısıtlama uygulamak için, ama görünmüyor. Bunun yerine, bir bileşen işlemleri ayrı ayrı bağlar: &
/|
ve ?:
. Böylece bu mümkün için karışıklık yoluyla ise ilk işleneni olur true
false
(boolean değerleri ve böylece izin verilen ilk işlenen ?:
), ama eÄŸer sen ver null
olarak ilk işlenen (örneğin eğer deneyin B && A
yukarıdaki örnekte olduğu gibi), senin bir çalışma zamanı bağlayıcı bir durum.
Eğer düşünürsen, dinamik &&
||
bu şekilde gerçekleştirdik neden görebilirsin yerine büyük bir dinamik operasyonu: dinamik işlemleri çalışma süresinde bağlı ^em>onların işlenen değerlendirilmektedirbağlama bu değerlendirme sonuçları çalışma zamanı tür dayalı olabilir , bu yüzden. Ama böyle istekli değerlendirme kısa-devre operatörleri amacı yendi! Bunun yerine, dinamik olarak oluşturulan kodu &&
||
değerlendirme parçalara ayırır ve aşağıdaki gibi devam edecek
- Sol işlenen (bakalım sonuç
x
çağrı) değerlendirmek - Örtük dönüştürme, ya da
true
veyafalse
operatörler (yapamaz başarısız)bool
bir dönüştürebilirim ?:
bir çalışma koşulu olarakx
kullanın- Gerçek şube, sonuç olarak
x
kullanın - Yanlış şube,şimdiikinci işlenen (bakalım sonuç
y
çağrı) değerlendirmek x
y
çalışma tipi (yapamaz başarısız) dayalı&
ya|
operatör bağlamak için deneyin- Seçilen operatör geçerlidir
Bu bazı "yasadışı" işlenen kombinasyonları: ?:
operatör başarıyla ilk işlenen davranır gibi bir . davranıştır ^em>null olmayanboolean, &
|
operatör başarılı olarak değerlendirirnullboolean ve ikisi asla kabul ettiklerini kontrol etmek için koordine.
Dinamik || nullables üzerinde çalışmak && ve bu yüzden değil. Biraz da hoşgörülü bir şekilde uygulanmaya verirler, statik duruma göre. Bu muhtemelen bir hata olarak kabul edilmelidir, ama asla kırma bir değişiklik olacağı tamir edeceğiz. Ayrıca hiç kimse bu davranış sıkmak için yardımcı olur.
Umarım bu olanları açıklıyor! Bu ilginç bir alandır, ve ben sık sık dinamik bir şekilde uyguladığımız zaman verdiğimiz kararların sonuçları ile kendimi şaşkın bulun. Bu soruyu lezzetli - konuyu açtığın için teşekkürler!
Mads
Neden kısa null null değerleri ile kar...
Hangi MySQL boolean deÄŸerleri saklamak...
Null değerleri kontrol etmek için doğr...
Kısa-devre boolean operatörler C/C zor...
Boolean değerleri ile modeller için Ba...