Tôi đang tìm kiếm cái gì sử dụng mẫu như thế này:Constrain chung là một loại nullable
Foo<string> stringFoo = new Foo<string>("The answer is");
Foo<int> intFoo = new Foo<int>(42);
// The Value of intFoo & stringFoo are strongly typed
stringFoo.Nullify();
intFoo.Nullify();
if (stringFoo == null && intFoo == null)
MessageBox.Show("Both are null);
Với lớp này Foo, tôi có thể tự động quấn T thành một nullable:
public class Foo1<T>
where T : struct
{
private T? _value;
public Foo(T? initValue)
{
_value = initValue;
}
public T? Value { get { return _value; } }
public void Nullify { _value = null; }
}
Điều này làm việc cho nguyên thủy, nhưng không phải với String hoặc các lớp khác.
hương vị Tiếp làm việc cho chuỗi, nhưng không phải nguyên thủy:
public class Foo2<T>
{
private T _value;
public Foo(T initValue)
{
_value = initValue;
}
public T Value { get { return _value; } }
public void Nullify { _value = default(T); }
}
tôi có thể sử dụng Nullable<int>
cho foo2 và mã sẽ làm việc như thế này:
Foo2<int?> intFoo = new Foo<int?>(42);
Nhưng điều này là dễ bị lỗi vì nó không thành công cho Foo2. Nếu tôi có thể hạn chế T là các loại hỗ trợ nullability thì điều đó sẽ ổn thôi.
Vì vậy, sau khi tất cả điều đó, có cách nào để hạn chế T là một loại nullable không?
Một số lưu ý bổ sung: .NET 4.0, VS2010. Và tôi đã tìm thấy một câu hỏi tương tự như vậy ở đây, nhưng không có câu trả lời thành công.
Thú vị. Trong cuộc sống thực, Foo phức tạp hơn và được tạo tự động bởi một khung công tác. Tôi sẽ cần phải xem nếu có một cách để móc/tùy chỉnh cách thức các đối tượng được tạo ra để làm cho phương pháp này khả thi. – tcarvin
Được chấp nhận, vì nó mang lại sự ngạc nhiên ít nhất cho khách hàng nội bộ của thư viện (thiết kế/biên dịch thời gian so với thời gian chạy). Nhưng bài kiểm tra được sử dụng bởi @ JonSkeet cũng tuyệt vời! – tcarvin