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