C#中的可选/无效OUT参数

时间:2011-06-30 18:34:12

标签: c# parameters nullable

我有一个方法有几个覆盖。在其中一个更扩展的覆盖中,我想返回一个OUT参数,但不是在我更简单的覆盖中。例如:

public bool IsPossible(string param1, int param2)
public bool IsPossible(string param1, int param2, out bool param3)

我目前实现这一目标的方式是这样的:

public bool IsPossible(string param1, int param2) {
    bool temp;
    return IsPossible(param1, param2, out temp);
}

有没有更好的方法来实现这一目标?我(或我应该)可以使用无效的参数吗?

6 个答案:

答案 0 :(得分:17)

这对我来说很好看。由于技术原因,out不能是可选的(它需要指向有效的实例)。

答案 1 :(得分:4)

A 'ref' or 'out' parameter cannot have a default value.

你做的方式很好。对不起,没有银弹。

答案 2 :(得分:4)

就我个人而言,我觉得它很好“。但另一种方法是返回一个复合返回值(可能是一个带有2个属性的不可变结构);这避免了一些人避免out的事实。我不是那些人之一:p

回答问题;实际上,out / ref不能是可选的。

如果你想得到不必要的幻想,你可以给conposite return-type转换为bool以允许隐式if测试。

答案 3 :(得分:4)

OP:

  

我(或我应该)可以使用null-out out参数吗?

可以为空的参数对你没什么好处。这样:

public bool IsPossible( string param1, int param2, out bool? param3 )
{
  ...
}

不会使param3成为可选项。它会更改param3 的语义。 bool?(又名Nullable<bool>)将param3的域从2个值(truefalse)扩展为3,添加第三个值({{1}通常被解释为缺失/未知。调用者仍然必须提供所有三个参数。

通过提供过载来重载null - “不关心”场景 - 丢弃参考参数是正确的解决方案。

答案 4 :(得分:2)

从C#7.0开始,您可以将Discard(_)传递给方法:

return IsPossible(param1, param2, _);

请参阅:https://docs.microsoft.com/en-us/dotnet/csharp/discards

答案 5 :(得分:1)

是的,Nullable变量很棒。然后你会做这样的事情。

public bool? IsPossible(string param1, int param2);

var ans = IsPossible("Parm1", 1);
if (ans.HasValue)
{
   //working.
 }