Dalam proyek C# 8, saya menggunakan tipe referensi nullable dan mendapatkan peringatan CS8629 yang tidak terduga (atau setidaknya, tidak terduga bagi saya),

bool singleContent = x.DataInt != null;
bool multiContent = x.DataNvarchar != null;

if (singleContent && multiContent)
{
    throw new ArgumentException("Expected data to either associate a single content node or " +
        "multiple content nodes, but both are associated.");
}

if (singleContent)
{
    var copy = x.DataInt.Value; // CS8629 here
    newPropertyData.DataNvarchar = $"umb://{type.UdiType}/{Nodes[copy].UniqueId.ToString("N")}";
}

Saya telah memutuskan untuk menggunakan GetValueOrDefault() sebagai solusi, tetapi saya ingin tahu bagaimana membuktikan kepada kompilator bahwa x.DataInt tidak bisa nol jika singleContent dicentang.

Perhatikan bahwa jenis x.DataInt adalah int?.

7
jdphenix 9 Agustus 2019, 18:14

1 menjawab

Jawaban Terbaik

Ini hanya jawaban sementara sampai Julien Couvreur, salah satu desainer tipe referensi nullable memposting jawaban pasti (mengomel). Saya memposting ini di sini karena pertanyaannya akan ditanyakan lagi setelah C# 8 dirilis.

Saat Julien menjawab dalam 3 edisi Github #34800, #37032 dan #36149 ini adalah batasan yang diketahui dari penganalisis C# 8 yang di luar cakupan C# 8.

Ini memerlukan analisis alias yang (hanya menebak di sini) berarti penganalisis akan dapat menganalisis ekspresi alias, yaitu ekspresi yang hasilnya "tersembunyi" di balik variabel sementara (mungkin juga parameter?).

Mungkin kita bisa bertanya padanya atau Mads Torgersen secara online kapan .NET Core 3 dirilis selama .NET Conf 2019 tentang tanggal rilis (sama sekali tidak mengganggu)

4
Panagiotis Kanavos 13 Agustus 2019, 09:42