C#可选输出参数

C#可选输出参数,c#,null,out,C#,Null,Out,有没有办法使方法的out参数成为可选的?我有一个方法,大多数时候需要几个参数来返回null,但有时它们会有一个值。我试图找出是否有更好的方法来实现这一点,而不是首先将值设置为null,或者在if/else之后将它们设置为null。这可能是实现这一点的唯一方法,但如果有可选的out参数或类似的东西,那就太好了。代码如下: private static void GetInitInfo(string initLine, string ncPointType, out double? reli

有没有办法使方法的out参数成为可选的?我有一个方法,大多数时候需要几个参数来返回null,但有时它们会有一个值。我试图找出是否有更好的方法来实现这一点,而不是首先将值设置为null,或者在if/else之后将它们设置为null。这可能是实现这一点的唯一方法,但如果有可选的out参数或类似的东西,那就太好了。代码如下:

    private static void GetInitInfo(string initLine, string ncPointType, out double? relinquishDefault, out bool? ignoreRelinquishDefault, out bool? closedForStart, out bool? adjustDisabled)
    {
        relinquishDefault = null;
        ignoreRelinquishDefault = null;
        closedForStart = null;
        adjustDisabled = null;

        switch (ncPointType)
        {
            case "MSD":
                adjustDisabled = LastToken<bool?>(initLine);
                break;
            case "BO":
                relinquishDefault = SecondToken<double>(initLine);
                closedForStart = ThirdToken<bool?>(initLine);
                ignoreRelinquishDefault = !ForthToken<bool?>(initLine);//ignoreRelDef would be reverse of use initial value
                break;
            case "MSO":
                closedForStart = SecondToken<bool?>(initLine);
                relinquishDefault = ThirdToken<double>(initLine);
                ignoreRelinquishDefault = !ForthToken<bool?>(initLine);//ignoreRelDef would be reverse of use initial value
                break;
            case "AD":
                relinquishDefault = ThirdToken<double>(initLine);
                ignoreRelinquishDefault = false;
                break;
            case "BD":
                relinquishDefault = SecondToken<double>(initLine);
                adjustDisabled = LastToken<bool?>(initLine);
                ignoreRelinquishDefault = false;
                break;
            case "AOS":
                relinquishDefault = FirstToken<double>(initLine);
                ignoreRelinquishDefault = !ThirdToken<bool?>(initLine);//ignoreRelDef would be reverse of use initial value
                break;
        }
    }
private static void GetInitInfo(字符串initLine,字符串ncPointType,out-double?放弃默认值,out-bool?忽略放弃默认值,out-bool?关闭启动,out-bool?调整禁用)
{
放弃默认值=null;
IgnoreReluishDefault=null;
closedForStart=null;
adjustDisabled=null;
开关(ncPointType)
{
案例“MSD”:
adjustDisabled=LastToken(initLine);
打破
案例“BO”:
relquishdefault=SecondToken(initLine);
closedForStart=ThirdToken(初始行);
ignoreRelinquishDefault=!ForthToken(initLine);//ignoreRelDef将与使用初始值相反
打破
案例“MSO”:
closedForStart=SecondToken(initLine);
放弃默认值=ThirdToken(initLine);
ignoreRelinquishDefault=!ForthToken(initLine);//ignoreRelDef将与使用初始值相反
打破
案例“AD”:
放弃默认值=ThirdToken(initLine);
IgnoreReluishDefault=false;
打破
案例“BD”:
relquishdefault=SecondToken(initLine);
adjustDisabled=LastToken(initLine);
IgnoreReluishDefault=false;
打破
案例“AOS”:
relquishDefault=FirstToken(initLine);
IgnoreReluishDefault=!ThirdToken(initLine);//ignoreRelDef将与使用初始值相反
打破
}
}

根据C#4.0规范:第21.1节,这是不允许的


解决方法是使用另一种没有out或ref参数的方法重载。

根据C#4.0规范:第21.1节,这是不允许的


解决方法是使用另一个没有out或ref参数的方法重载。

使用没有out参数的签名重载:

private static void GetInitInfo(string initLine, string ncPointType)
{
  double? relinquishDefault;
  bool? ignoreRelinquishDefault;
  bool? closedForStart;
  bool? adjustDisabled;

  GetInitInfo( initLine, ncPointType, out relinquishDefault, out ignoreRelinquishDefault, 
    out closedForStart, out adjustDisabled);
}

将重载与没有out参数的签名一起使用:

private static void GetInitInfo(string initLine, string ncPointType)
{
  double? relinquishDefault;
  bool? ignoreRelinquishDefault;
  bool? closedForStart;
  bool? adjustDisabled;

  GetInitInfo( initLine, ncPointType, out relinquishDefault, out ignoreRelinquishDefault, 
    out closedForStart, out adjustDisabled);
}

解释很简单:你可以做到。只需将方法内部的out参数指定给所需的值

现在你可以问自己,为什么我们不能在方法签名中这样做?好吧,让我们看一下普通的可选值参数。如果调用者未指定它们,则会为它们指定一个预定义的值。因此,调用者知道该值,如果未显式设置参数,则将传递该值。它控制着它,并对这一决定负责

由于方法的调用方不负责out参数的赋值,因此提供默认值是没有意义的。通过拥有一个默认的out参数值,您可以实现的唯一一件事是让调用者知道out参数的一个可能值是什么。但这有意义吗?何时使用此值?在什么情况下?所有这些仍然对来电者隐藏。因此,除了有可能在签名内部而不是在方法体中设置参数值之外,使用可选的out参数值并没有任何实际好处

因此,话虽如此,以下几点没有多大意义:

public bool TrySomething(out string outObject = "default value") { ... }
然而,最酷的是允许使用以下方法

public bool TrySomething(out string outObject) { ... }
按如下方式调用:

bool result = TrySomething();
在幕后,这相当于:

string dummyWhichWillNeverBeUsed;
bool succeeded = TrySomething(out dummyWhichWillNeverBeUsed);
不幸的是,这是不允许的


当然,正如在其他答案中所解释的,您总是可以使用没有out参数的重载。

解释非常简单:您可以这样做。只需将方法内部的out参数指定给所需的值

现在你可以问自己,为什么我们不能在方法签名中这样做?好吧,让我们看一下普通的可选值参数。如果调用者未指定它们,则会为它们指定一个预定义的值。因此,调用者知道该值,如果未显式设置参数,则将传递该值。它控制着它,并对这一决定负责

由于方法的调用方不负责out参数的赋值,因此提供默认值是没有意义的。通过拥有一个默认的out参数值,您可以实现的唯一一件事是让调用者知道out参数的一个可能值是什么。但这有意义吗?何时使用此值?在什么情况下?所有这些仍然对来电者隐藏。因此,除了有可能在签名内部而不是在方法体中设置参数值之外,使用可选的out参数值并没有任何实际好处

因此,话虽如此,以下几点没有多大意义:

public bool TrySomething(out string outObject = "default value") { ... }
然而,最酷的是允许使用以下方法

public bool TrySomething(out string outObject) { ... }
按如下方式调用:

bool result = TrySomething();
在幕后,这相当于:

string dummyWhichWillNeverBeUsed;
bool succeeded = TrySomething(out dummyWhichWillNeverBeUsed);
不幸的是,这是不允许的


当然,正如在其他答案中所解释的,您总是可以在没有out参数的情况下使用重载。

我相信这个问题是关于必须在没有out参数的方法中指定值,以及是否有任何方法可以绕过这个问题,也就是说,保留未分配的值,而不是显式地分配它们
null

e、 g.你必须写:

public bool OutMethod(out int? output)
{
    output = null;
    return true;
}
或者有没有一种方法可以这样做:

public bool OutMethod(out int? output)
{
    return true;
}
同样的结果

简言之,答案是否定的,这是不可避免的。参见whi的示例