目前,当尝试在采用out参数的方法中执行某些操作时,我需要在方法体中指定out参数的值,例如
public static void TryDoSomething(int value, out bool itWorkerd)
{
itWorkerd = true;
if (someFavourableCondition)
{
// if I didn't assign itWorked variable before this point,
// I get an error: "Parameter itWorked must be assigned upon exit.
return;
}
// try to do thing
itWorkerd = // success of attempt to do thing
}
我希望能够设置itWorked
参数的默认值,因此我不必随意设置方法正文中的值。
public static void TryDoSomething(int value, out bool itWorkerd = true)
{
if (someFavourableCondition)
{
// itWorked was already assigned with a default value
// so no compile errors.
return;
}
// try to do thing
itWorkerd = // success of attempt to do thing
}
为什么无法为out
参数指定默认值?
答案 0 :(得分:4)
默认值可用于按值传递的参数。该参数仍传递给函数,但如果代码省略了参数,则编译器提供缺失值。
您建议的功能完全不同。您建议允许函数的实现者省略设置值,而不是调用者省略传递值。所以,这是一个完全不同的功能。为什么没有实施?以下是一些可能的原因:
答案 1 :(得分:2)
我很欣赏这并不能完全回答原来的问题,但我无法为评论做出贡献。我自己也有同样的问题,所以在这里找到了自己。
由于C#7现在允许参数在调用范围内有效地成为变量声明,因此分配默认值会很有用。
考虑以下简单方法:
private void ResolveStatusName(string statusName, out string statusCode)
{
statusCode = "";
if (statusName != "Any")
{
statusCode = statusName.Length > 1
? statusName.Substring(0, 1)
: statusName;
}
}
直接修改它是这样的:
private void ResolveStatusName(string statusName, out string statusCode = "")
{
if (statusName != "Any")
{
statusCode = statusName.Length > 1
? statusName.Substring(0, 1)
: statusName;
}
}
目的是不仅要声明statusCode
值,还要定义它的默认值,但编译器不允许它。
答案 2 :(得分:0)
即使它允许你给出这样的默认值,它仍然需要你为所有返回的参数赋值。因此,您的默认值将被覆盖。
答案 3 :(得分:0)
方法参数上的out方法参数关键字使方法引用传递给方法的同一变量。当控制传递回调用方法时,对方法中的参数所做的任何更改都将反映在该变量中。 当您希望方法返回多个值时,声明out方法很有用。使用out参数的方法仍然可以返回值。一个方法可以有多个out参数。 要使用out参数,必须将参数显式作为out参数传递给方法。 out参数的值不会传递给out参数。 作为out参数传递的变量无需初始化。但是,必须在方法返回之前为out参数指定一个值。
编译器不允许您将参数用作默认参数,因为它违反了其用例。如果你没有将它传递给函数,你就不能在调用函数时使用它的值。
如果您可以调用TryDoSomething(123)
以下的功能,那么就不会使用out参数,因为您将无法使用itWorked
的值
public static void TryDoSomething(int value, out bool itWorkerd = true)
{
if (someFavourableCondition)
{
// itWorked was already assigned with a default value
// so no compile errors.
return;
}
// try to do thing
itWorkerd = // success of attempt to do thing
}
答案 4 :(得分:0)
默认参数值是在中传递给方法的参数的默认值。您必须指定一个变量以传递 out 参数,以便您可以获取返回的值。
在某种程度上,您的第一个示例在方法的开头设置了默认值。