Thông tin loại tham chiếu Nullable không được hiển thị từ FirstOrDefault


10

Tôi muốn thử nghiệm tính năng loại tham chiếu nullable mới trong C # 8.0.

Tôi đã bắt đầu một dự án mới nhắm mục tiêu .NET Core 3.0, kích hoạt các loại tham chiếu nullable trong .csprojtệp và bắt đầu mã hóa. Tôi đã tạo một danh sách đơn giản lấy một string[]và trả về stringmảng đó bằng abc. Bây giờ, vì tôi không chắc chắn abcthực sự tồn tại trong mảng, tôi sử dụng FirstOrDefault(), nên mặc định nullnếu không tìm thấy kết quả khớp.

using System;
using System.Linq;

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

Phương pháp lợi nhuận của tôi string, mà nên hiện nay là không nullable loại. Vì FirstOrDefault()có thể quay trở lại null, tôi mong muốn phương thức trên sẽ đưa ra cảnh báo khi trả về biến có thể null arg . Nó không.

Nhìn vào chữ ký FirstOrDefault()trong Visual Studio, rõ ràng lý do : Phương thức trả về a string, không phải là giá trị tương đương null string?tôi mong đợi.

Sử dụng phần thân phương thức bên dưới sẽ mang lại cảnh báo mà tôi mong đợi:

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

Các thư viện hệ thống (trong ví dụ này System.Linq) có thực sự không để lộ thông tin vô hiệu khi nhắm mục tiêu .NET Core 3.0 không?

Câu trả lời:


9

Có vẻ như System.Linqkhông được chú thích nullable trong phiên bản 3.0. Vì vậy, các loại tham chiếu Nullable không phát ra cảnh báo chính xác.

Bạn có thể kiểm tra các vấn đề tương tự trong repo roslyn . Vấn đề mở này trên Github rất giống với vấn đề của bạn. Trong vấn đề đó, một người đóng góp giải thích vấn đề hiện tại:

System.Linqđược nullable chú thích trong tổng chi nhánh của corefx, nhưng không phải trong phát hành / 3.0 . Vì vậy, không có gì bất ngờ trong trình biên dịch. Trình biên dịch sẽ cung cấp một số chẩn đoán cho thấy rằng bạn đang sử dụng công cụ không thể quên được.


Để thêm vào điều này, bạn có thể sử dụng gói này để có được các chú thích đúng ngày hôm nay.
canton7

1
Đây vẫn là trường hợp trong .NET Core 3.1. Nó làm cho làm việc với các loại tham chiếu nullable ít tốt đẹp. Tôi tin rằng yêu cầu kéo corefx / pull / 40651 khắc phục điều này, nhưng rõ ràng chúng ta sẽ phải đợi đến .NET 5 để có được điều đó :-(
Jeppe Stig Nielsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.