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)
và T
khô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 T
không thể rỗng:
public static T Get<T>(T value) where T: notnull
{
return value;
}
Tuy nhiên, nơi T
khô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 T
khô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
.