0

我在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',那么为什么下面的代码给出错误说“必须在控制离开当前方法之前分配输出参数'num1'”,即使我没有在那里写任何语句或不使用num1和我已经在被调用者方法中为其分配了值?

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

4

4 回答 4

3

这是设计使然。

From out 参数修饰符(C# 参考)

尽管作为输出参数传递的变量在传递之前不必进行初始化,但被调用的方法需要在方法返回之前分配一个值。

于 2013-08-19T05:01:46.903 回答
3

出来。_ 您可以想象这是返回值的另一种方式returnout之间的显着区别在于您只能返回一个值,但可以返回不同数量的值。当您的方法需要输出多个值时,它特别有用,例如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 参数的值,但使端点不可达也会编译。

于 2013-08-19T05:17:21.323 回答
1

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

于 2013-08-19T05:01:43.263 回答
1

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

于 2013-08-19T05:01:45.017 回答