值为“0”;out”;参数必须在方法体中赋值,否则将不会编译该方法

本文关键字:方法 编译 赋值 参数 out 值为 | 更新日期: 2023-09-27 18:28:12

我在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,并且我已经在被调用者方法中为它分配了值?

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

值为“0”;out”;参数必须在方法体中赋值,否则将不会编译该方法

这是经过设计的。

From-out参数修改器(C#参考)

尽管作为out参数传递的变量不必在传递之前已初始化,调用的方法需要在方法返回之前赋值。

outout。您可以想象,这是返回值的替代方法returnout之间的显著区别在于,您只能返回一个值,但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参数的值,但使端点不可访问也将编译。

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

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