C# 是否可以解构出ValueTuple参数?

C# 是否可以解构出ValueTuple参数?,c#,c#-7.0,C#,C# 7.0,是否可以解构一个不是从方法返回的元组,而是一个out参数?我不确定我是否正确表达了自己,甚至使用了正确的术语,因此这里有一些例子: void OutMethod(out (int aNumber, string someText) output) => output = (15, "yo"); void Usage() { { // Works, of course. OutMethod(out var tuple); /

是否可以解构一个不是从方法返回的元组,而是一个out参数?我不确定我是否正确表达了自己,甚至使用了正确的术语,因此这里有一些例子:

void OutMethod(out (int aNumber, string someText) output)
    => output = (15, "yo");

void Usage()
{
    {
        // Works, of course.
        OutMethod(out var tuple);

        // But *slightly* aesthetically unappealing to use.
        var usage = $"{tuple.someText}: {tuple.aNumber}";
    }

    {
        // Would be awesome, but doesn't work.
        OutFunction(out var(number, text));
    }

    {
        // Would be awesome too, but doesn't work.
        OutFunction(out (var number, var text));
    }

    {
        // This doesn't work either.
        OutFunction((out var number, out var text));
    }

    {
        // Not even this.
        OutFunction((out int number, out string text));
    }

    {
        // Or this.
        OutMethod(out (int number, string text));
    }

    {
        // Or this.
        int number;
        string text;
        OutMethod(out (number, text));
    }
}

顺便说一句,不要抱怨。只是想知道我是否遗漏了什么。

这目前是不可能的:

这是我们在LDM(语言设计会议)上讨论的问题,当时我们正在进行试验,并决定不这样做,至少在不久的将来


因此,在未来的一段时间内,它可能仍然是“不可能的”。

虽然另一个答案是正确的,因为它不能作为函数调用的一部分在一行中完成,但您当然可以根据需要手动解构out参数:

OutMethod(out var tuple);
(int aNumber, string someText) = tuple;
var usage = $"{someText}: {aNumber}";

这至少可以解决您的使用问题。

我认为在
out
参数中允许元组解构是毫无意义的,因为您可以轻松地生成两个不同的
out
变量。@DavidG不使用泛型类型。在我的例子中出现这种情况是因为我试图在
字典
上尽可能优雅地使用
TryGetValue
。在这一点上,我可能会质疑元组是否是正确的使用类型,也许结构或类更合适?@DavidG字典是类内部的私有元素,不是公共API的一部分。我不相信添加自定义类会给我带来任何特殊的好处。它当然不允许对元素进行解构。是的,我看起来很容易理解,不知道为什么有5个人会这样想。我最喜欢的是,你可以像这样完整地使用
var
OutMethod(out-var-tuple);var(aNumber,someText)=元组