SORU
16 Aralık 2014, Salı


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
17 Aralık 2014, ÇARŞAMBA


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 veya false operatörler (yapamaz başarısız) bool bir dönüştürebilirim
  • ?: bir çalışma koşulu olarak x 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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrea Lewis

    Andrea Lewis

    14 Mart 2013
  • iNCH

    iNCH

    20 Temmuz 2009
  • Joshua Kywn

    Joshua Kywn

    17 Mayıs 2010