这在 C# 7.3(框架 4.8)中正确编译:
(string, string) s = ("a", "b");
(object, string) o = s;
我知道这是以下的语法糖,它也可以正确编译:
ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
因此,看来 ValueTuples 可以协变地分配,这太棒了!
不幸的是,我不明白为什么:我的印象是 C#只支持接口和委托的协变。ValueType
也不是。
事实上,当我尝试用自己的代码复制此功能时,我失败了:
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>'
那么,为什么ValueTuple
s 可以协变赋值,而MyValueTuple
s 不能呢?