我在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方法?
答案 0 :(得分:3)
答案 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。