为什么你只能用一个值来构造一个元组?

时间:2016-11-20 23:20:38

标签: c# destructuring c#-7.0

在C#7中,它apparently无法仅使用一个项目解构为元组。

ValueTuple<T1>存在,所以不是因为这个。

向后兼容性意味着Deconstruct方法,其中一个参数也必须合法:

public void Deconstruct(out int i)

那么为什么你不能写:

var (num) = foo;

仅仅是因为没有合理的用例吗?

2 个答案:

答案 0 :(得分:5)

我的猜测:考虑以下情况:

int num;
(num) = foo;

如果foo定义了一个带有out int的解构函数和一个隐式的int强制转换操作符,那么在这种情况下应该调用它是不明确的

在这种特定情况下可能会出现编译错误,同时允许我猜测的一般情况,但是,正如您所提到的那样,没有用例,语法会令人困惑,也许有意义不允许它在所有

答案 1 :(得分:1)

我正在使用Visual Studio 2017 RC。我发现了Connect();您列出的参考不正确。您列出的示例语法可以编译并运行。

作为测试,我使用了以下代码:

public class Foo
{
    public int Bar { get; set; }

    public void Deconstruct(out int bar)
    {
        bar = Bar;
    }
}

var foo = new Foo { Bar = 3 };
var (num) = foo; //num is an int with a value of 3
var obj = foo; //obj is a Foo object with the same reference as foo

在上面的示例中,num变量是int,其值为3. obj变量是Foo对象,其引用与{{1}相同}}

以下内容无法编译:

foo