首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么使ValueTuple协变?

什么使ValueTuple协变?
EN

Stack Overflow用户
提问于 2019-12-19 14:07:37
回答 1查看 696关注 0票数 39

这在C# 7.3 (Framework4.8)中正确编译:

代码语言:javascript
复制
(string, string) s = ("a", "b");
(object, string) o = s;

我知道这是用于下列方面的语法糖,它也正确地编译:

代码语言:javascript
复制
ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;

因此,ValueTuples似乎可以被分配给共变,这是很棒的!

不幸的是,我不明白为什么:我当时的印象是C# 仅支持接口和委托上的协方差。ValueType也不是。

实际上,当我尝试用我自己的代码复制这个特性时,我失败了:

代码语言:javascript
复制
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不能被分配?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-19 14:12:34

我相信这里实际上发生的是一项破坏性任务。元组赋值将尝试隐式转换其组件,并且由于可以将string分配给object,这就是这里发生的情况。

该语言支持具有相同元素数的元组类型之间的赋值,其中每个右侧元素可以隐式转换为其对应的左侧元素。其他转换不考虑外派。

来源

在sharplab.io上看

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59411397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档