c# 7.3 ValueTuple - 在解构后检查默认值

c# 7.3 ValueTuple - check for default after destructuring

我有

(string name, int val) f(bool ok) {
   if (!ok) return default;
   return ('John', 5);
}

然后我在某个地方做:

var result = f(true);
if (result==default) return false;
var (name, val) = result;
... do something with name & val

我发现这令人困惑且过于冗长。我只为默认检查创建 result - 否则我不需要它...是否有更优雅的方式来检查默认情况而不使用result 中间变量 ?

我能做到:

var (name, val) = f(true);
if ((name, val)==default) return false;
... do something with name & val

但这又很乏味,尤其是当 ValueTuple 有很多参数时...

编辑:

我现在意识到上面的代码不仅冗长而且一般模式是有问题的 - 你不能使用默认值作为错误状态的替代品,原因是对于某些 ValueTuple - 即(int,int) - 不可能将默认值与其他有效值区分开来 - 即 (0, 0) 等 ..

您可以使用以下内容。

var (name,val) = f(true);
if ((name, val) == default)

该语言没有更简洁的方式来实现您想要的

但是,另一种方法是使用 尝试 模式

private static bool TryF(bool ok, out (string name, int val) result)
{
   if (!ok)
   {
      result = default;
      return false;
   }
   result =  ("John", 5);
   return true;
}

...


if (!TryF(false, out var result))
   return;

// continue

您可以 return 一个可为 null 的元组。它比 return 使用默认元组稍微优雅一些​​,但比 Michael Randall 的 TryXXX 答案差。

private static (string name, int val)? F(bool ok) {
    if (!ok) return null;
    return ("John", 5);
}

var result = F(true);
if (result == null)
    return;
var (name, val) = result.Value;

我最后做了:

private (bool ok, string name, int val) F(bool ok) {
    if (!ok) return (false, "", 0);
    return (true, "John", 5);
}

var (ok, name, val) = F(true);
if (!ok) return;
.. continue