C # 8'de Bilinmeyen Güvenlik Açığı Nedir?


12

C # 8.0'da nullable referans tiplerine sahip olabiliriz. Dokümanlar 4 tür nullsellik olduğunu belirtiyor. İlk 3 oldukça açık ama "bilinmeyen" noktasını anlayamıyorum. Dokümanlar jeneriklerle birlikte kullanıldığını söylüyor, ancak jeneriklerde kısıtlanmamış bir T türü değişkeni üzerinde bir yöntem çağırmaya çalıştığımda, tür nullable gibi uyarıyor. Bilinmeyen ve null edilebilir arasındaki farkı göremiyorum. Bilinmeyen neden var? Kendini nasıl gösterir?

Yanıtlar:


12

Aşağıdaki genel yöntemi kullanın:

public static T Get<T>(T value)
{
    return value;
}

Bunu şöyle çağırırsak Get<string>(s), dönüş null edilemez ve eğer yaparsak Get<string?>(s), null edilebilir.

Eğer gibi genel bir argüman ile aradığınız Ancak eğer Get<T>(x)ve Törneğin çözülmezse aşağıda gibi jenerik sınıfına genel argümandır ...

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // is result nullable or non-nullable? It depends on T
    }
}

Burada derleyici null veya nullable tipiyle çağrılıp çağrılmayacağını bilmiyor.

TBoş olmayan sinyaller için kullanabileceğimiz yeni bir tür kısıtlaması vardır :

public static T Get<T>(T value) where T: notnull
{
    return value;
}

Bununla birlikte, Tkısıtsız ve hala açık olan yerlerde, nullabilite bilinmemektedir.

Bu bilinmeyenler boş değerli olarak değerlendirildiyse, aşağıdaki kodu yazabilirsiniz:

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // reassign result to null, cause we we could if unknown was treated as nullable
        result = null;
    }
}

TNull değerinin olmadığı durumlarda bir uyarı almalıyız. Bilinmeyen nullabilite türlerinde, kayıt silme işlemi sırasında uyarılar ve potansiyel olarak atama uyarıları istiyoruz null.


Ne zaman var var sonuç = Test.Get <T> (x); ) (result.ToString; derleyici, geçersiz bir değerin silinmesi hakkında şikayette bulunur. Bu durumda bilinmeyenin basitçe null edilebilirden ne kadar farklı olduğunu görmüyorum.
Stilgar

1
Uyarılar açısından aynı davranıyorlar, ancak anlamsal olarak farklılar. Aradaki farkın akademik olduğunu söyleyebilirsiniz.
Stuart

1
Hala farkın neden tanıtıldığını bilmek istiyorum. Akademik amaçlar için dilde böyle bir ayrım yapmak garip görünüyor.
Stilgar

Benim kötü, sadece spec yeniden okumak, cevap güncelleme, son kısmı açıklıyor.
Stuart

1
Ah bu daha çok
Stilgar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.