Informasi jenis referensi yang tidak dapat dihapus dari FirstOrDefault

10

Saya ingin menguji fitur jenis referensi nullable baru di C # 8.0.

Saya memulai proyek baru yang menargetkan .NET Core 3.0, mengaktifkan jenis referensi yang tidak dapat dibatalkan dalam .csprojfile, dan mulai mengkode. Saya membuat daftar sederhana yang mengambil string[]dan mengembalikan stringarray yang sama dengan itu abc. Sekarang, karena saya tidak yakin yang abcbenar - benar ada dalam array, saya menggunakan FirstOrDefault(), yang seharusnya default nulljika kecocokan tidak ditemukan.

using System;
using System.Linq;

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

Metode saya mengembalikan string, yang seharusnya sekarang menjadi tipe yang tidak dapat dibatalkan . Karena FirstOrDefault()dapat kembali null, saya akan mengharapkan metode di atas untuk menghasilkan peringatan ketika mengembalikan variabel mungkin nol arg . Itu tidak.

Melihat tanda tangan untuk FirstOrDefault()di Visual Studio, jelas mengapa : Metode mengembalikan a string, bukan setara nullable yang string?saya harapkan.

Menggunakan tubuh metode di bawah ini menghasilkan peringatan yang saya harapkan:

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

Apakah pustaka sistem (dalam contoh ini System.Linq) benar-benar tidak memaparkan informasi nullability ketika menargetkan .NET Core 3.0?

Thorkil Holm-Jacobsen
sumber

Jawaban:

9

Sepertinya System.Linqtidak ada penjelasan nol dalam rilis 3.0. Jadi Jenis Referensi Nullable tidak memancarkan peringatan yang benar.

Anda dapat memeriksa masalah serupa di repo roslyn . Masalah terbuka di Github ini sangat mirip dengan masalah Anda. Dalam masalah itu seorang kontributor menjelaskan masalah saat ini:

System.Linqnullable dijelaskan di cabang master corefx, tetapi tidak di rilis / 3.0 . Jadi tidak ada yang tak terduga dalam kompiler. Kompiler harus menyediakan beberapa diagnostik yang menunjukkan bahwa Anda menggunakan hal-hal yang tidak dapat dibatalkan.

piraces
sumber
Untuk menambah ini, Anda dapat menggunakan paket ini untuk mendapatkan anotasi yang tepat hari ini.
canton7
1
Ini masih terjadi di .NET Core 3.1. Itu membuat bekerja dengan jenis referensi nullable kurang bagus. Saya percaya permintaan tarik corefx / pull / 40651 memperbaiki ini, tetapi tampaknya kita harus menunggu sampai .NET 5 untuk mendapatkan itu :-(
Jeppe Stig Nielsen