FirstOrDefault tarafından gösterilmeyen nullable referans türü bilgileri


10

C # 8.0 yeni nullable başvuru türleri özelliğini sınamak istedim .

.NET Core 3.0'ı hedefleyen yeni bir proje başlattım, .csprojdosyada nullable başvuru türlerini etkinleştirdim ve kodlamaya başladım. Ben alır string[]ve stringo dizi eşittir basit bir liste oluşturdu abc. Şimdi, abcaslında dizide var olduğundan emin değilim FirstOrDefault(), nullbir eşleşme bulunmazsa varsayılan olması gereken kullanın .

using System;
using System.Linq;

public string FindArgument(string[] args)
{
    var arg = args.FirstOrDefault(x => x == "abc");
    return arg;
}

Yöntemim string, şimdi null edilemeyen tür olması gereken döndürüyor . Geri döndüğünden beri , belki null değişkeni döndürürken yukarıdaki yöntemin bir uyarı vermesini beklerdim . O değil.FirstOrDefault()null arg

FirstOrDefault()Visual Studio'da imza bakarak, neden açıktır : Yöntem beklediğim stringboş değer eşdeğeri değil, a döndürür string?.

Aşağıdaki yöntem gövdesinin kullanılması beklediğim uyarıyı verir:

var arg = args.Contains("abc") ? "abc" : null;
return arg;

Sistem kitaplıkları (bu örnekte System.Linq), .NET Core 3.0'ı hedeflerken gerçekten güvenlik açığı bilgilerini göstermiyor mu?

Yanıtlar:


9

System.Linq3.0 sürümünde nullable açıklamalı değil gibi görünüyor . Dolayısıyla Null Edilebilir Referans Türleri doğru uyarıyı vermez.

Benzer sorunları roslyn deposunda da kontrol edebilirsiniz . Github'daki bu açık sorun sizin probleminize çok benzer. Bu sayıda bir katılımcı mevcut sorunu açıklar:

System.Linqcorefx'in ana dalında boş bırakılabilir, ancak sürüm / 3.0'da açıklanamaz . Yani derleyicide beklenmedik bir şey yok. Derleyici, nullable-oblivious şeyler kullandığınızı gösteren bazı tanılamalar sağlamalıdır.


Buna eklemek için, bugün doğru ek açıklamaları almak için bu paketi kullanabilirsiniz .
canton7

1
Bu hala .NET Core 3.1'de geçerlidir. Sıfırlanabilir referans türleriyle çalışmayı daha az hoş hale getirir. Çekme isteğinin corefx / pull / 40651'in bunu düzelttiğine inanıyorum , ancak görünüşe göre bunu elde etmek için .NET 5'e kadar beklemek zorundayız :-(
Jeppe Stig Nielsen
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.