这在C# 7.3 (Framework4.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>'那么,为什么ValueTuples可以被共同分配,而MyValueTuples不能被分配?
发布于 2019-12-19 14:12:34
我相信这里实际上发生的是一项破坏性任务。元组赋值将尝试隐式转换其组件,并且由于可以将string分配给object,这就是这里发生的情况。
该语言支持具有相同元素数的元组类型之间的赋值,其中每个右侧元素可以隐式转换为其对应的左侧元素。其他转换不考虑外派。
https://stackoverflow.com/questions/59411397
复制相似问题