Điều này biên dịch chính xác trong C # 7.3 (Khung 4.8):
(string, string) s = ("a", "b");
(object, string) o = s;
Tôi biết rằng đây là đường cú pháp cho những điều sau đây, cũng được biên dịch chính xác:
ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
Vì vậy, có vẻ như ValueTuples có thể được gán covariantly , thật tuyệt vời !
Thật không may, tôi không hiểu tại sao : Tôi có ấn tượng rằng C # chỉ hỗ trợ hiệp phương sai trên các giao diện và đại biểu . ValueType
không phải là.
Thực tế, khi tôi cố gắng sao chép tính năng này bằng mã của riêng mình, tôi đã thất bại:
struct MyValueTuple<A, B>
{
public A Item1;
public B Item2;
public MyValueTuple(A item1, B item2)
{
Item1 = item1;
Item2 = item2;
}
}
...
MyValueTuple<string, string> s = new MyValueTuple<string, string>("a", "b");
MyValueTuple<object, string> o = s;
// ^ Cannot implicitly convert type 'MyValueTuple<string, string>' to 'MyValueTuple<object, string>'
Vì vậy, tại sao ValueTuple
s có thể được gán covariantly, nhưng MyValueTuple
s không thể?
ValueTuple<object, string> o = new ValueTuple<object, string>(s.Item1, s.Item2);
public static implicit operator MyValueTuple<A, B>(MyValueTuple<string, string> v) { throw new NotImplementedException(); }
nó giải cấu trúc bài tập. Ngoài ra, câu hỏi tuyệt vời bằng cách này!
null
choNullable<T>
mặc dù đó là một cấu trúc.