【问题标题】:Is it possible to deconstruct out ValueTuple parameters?是否可以解构 ValueTuple 参数?
【发布时间】:2017-12-15 13:29:53
【问题描述】:

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

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));
    }
}

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

【问题讨论】:

  • 我认为在 out 参数中允许元组解构是毫无意义的,因为您可以轻松地创建两个不同的 out 变量。
  • @DavidG 不适用于泛型类型。这出现在我的案例中,因为我试图在 Dictionary<string,(int someNumber, string someString)> 上尽可能优雅地使用 TryGetValue
  • 到那时,我可能会质疑元组是否是正确使用的类型,也许结构或类更合适?
  • @DavidG 字典是类内部的私有元素,而不是公共 API 的一部分。我不相信添加自定义类会在我的情况下提供任何特殊好处。它当然不允许解构元素。
  • 是的,对我来说看起来很容易理解,不知道为什么 5 个人不这么认为。

标签: c# c#-7.0


【解决方案1】:

目前这是不可能的。 Further, according to this comment on the CSharplang github repo:

这是我们在 LDM [语言设计会议] 中进行分类并决定不做的事情,至少在不久的将来...

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我最喜欢这个的是你可以像这样var 满满的:OutMethod(out var tuple); var (aNumber, someText) = tuple;
    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2018-10-11
    • 2021-04-01
    相关资源
    最近更新 更多