必须在方法体中指定“out”参数的值,否则不会编译该方法

时间:2013-08-19 04:58:06

标签: c# out

我在c#

中有以下代码
class Sample{
public void sum(out int num1,int num2)
{
}
public void print()
{ int i=12;
sum(out i,10);
Console.WriteLine(i);
}
}

我已经读过它的工作方式类似于'ref',那么为什么下面的代码会给出错误说“在控制离开当前方法之前必须分配out参数'num1'”,即使我没有在那里写任何语句使用num1和i已经在callee方法中为它赋值?

如果我没有使用或初始化参数,那么为什么它没有初始化为其默认值,这里num1 = 0,并将该值返回到calee方法?

4 个答案:

答案 0 :(得分:3)

这是设计的。

来自out parameter modifier (C# Reference)

  

虽然作为out参数传递的变量不一定是   在传递之前初始化,需要调用方法   在方法返回之前分配一个值。

答案 1 :(得分:3)

out out 。您可以想象这是一种替代方式来返回值 return out 之间的显着差异在于,您只能返回一个值,但 out 各种值。当您的方法需要输出多于一个值(例如bool Dictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value))时,它尤其有用。

您看到的错误就像声明一个方法,该方法返回值指定要返回的内容。必须在代码到达可达端点之前分配out参数。编写一个为out参数赋值的语句是摆脱错误的常用方法:

public static void OutOfAssgnment<T>(out T value) {
    value=default(T);
}

但事实上,至少有三种其他方法可以编译:

public static void OutOfAnotherOut<T>(out T value) {
    OutOfAnotherOut(out value); // not necessarily be recursive, just an example
}

public static void OutOfThrowing<T>(out T value) {
    throw new Exception();
}

public static void OutOfInfiniteLoop<T>(out T value) {
    for(; ; )
        ;
}

后两者不分配out参数的值,但使端点不可达也会编译。

答案 2 :(得分:1)

类似于具有返回类型的函数必须在所有代码路径上返回值,具有out参数的函数还必须为所有代码路径上的out参数赋值。

答案 3 :(得分:1)

这是out参数的定义。这意味着它在调用之前不必设置,通常也不会设置,并且带有out参数的方法将设置它。如果你想事先设置它,并且能够在方法中修改它,你应该使用ref而不是out。