Nullability không xác định trong C # 8 là gì?


12

Trong C # 8.0 chúng ta có thể có các loại tham chiếu nullable. Các tài liệu nói rằng có 4 loại không có giá trị. 3 cái đầu khá rõ ràng nhưng tôi không hiểu được điểm "chưa biết". Các tài liệu nói rằng nó được sử dụng với generic, nhưng khi tôi cố gắng gọi một phương thức trên một biến không giới hạn của loại T trong generic thì nó chỉ cảnh báo như thể loại này là null. Tôi không thấy sự khác biệt giữa không xác định và nullable. Tại sao không biết tồn tại? Nó biểu hiện như thế nào?

Câu trả lời:


12

Thực hiện phương pháp chung sau:

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

Nếu chúng ta gọi nó là như thế Get<string>(s), lợi nhuận là không thể rỗng, và nếu chúng ta làm như vậy Get<string?>(s), nó là không thể.

Tuy nhiên, nếu bạn đang gọi nó với một đối số chung như Get<T>(x)Tkhông được giải quyết, ví dụ: đó là một đối số chung cho lớp chung của bạn như bên dưới ...

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

Ở đây trình biên dịch không biết liệu cuối cùng nó sẽ được gọi với kiểu nullable hay nonable nullable.

Có một ràng buộc kiểu mới mà chúng ta có thể sử dụng để báo hiệu Tkhông thể rỗng:

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

Tuy nhiên, nơi Tkhông bị ràng buộc và vẫn mở, không có giá trị.

Nếu những ẩn số này được coi là nullable thì bạn có thể viết đoạn mã sau:

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;
    }
}

Trong trường hợp Tkhông thể rỗng, chúng ta nên có một cảnh báo. Vì vậy, với các loại nullable không xác định, chúng tôi muốn cảnh báo khi hủy bỏ hội nghị, nhưng cũng cảnh báo cho việc gán có khả năng null.


Khi tôi làm var result = Test.Get <T> (x); kết quả.ToString (); trình biên dịch phàn nàn về việc hủy bỏ giá trị có thể là null. Tôi không thấy sự khác biệt như thế nào so với đơn giản là vô hiệu trong trường hợp này.
Stilgar

1
Về mặt cảnh báo họ hành xử giống nhau, nhưng họ khác nhau về mặt ngữ nghĩa. Bạn có thể nói sự khác biệt là học thuật, và nếu đó là quan điểm của bạn thì tôi đồng ý.
Stuart

1
Tôi vẫn muốn biết tại sao sự khác biệt được giới thiệu. Có vẻ lạ khi giới thiệu một sự khác biệt trong ngôn ngữ cho mục đích học tập.
Stilgar

Xấu của tôi, chỉ cần đọc lại thông số kỹ thuật, cập nhật câu trả lời, phần cuối cùng giải thích nó.
Stuart

1
Ah giống như thế hơn
Stilgar
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.