我注意到,C#编译器(.NET 4.5.2)不允许我编译下面的代码:为什么out参数需要在try和catch部分内初始化?
public void Test(out string value)
{
//value = null;
try
{
value = null;
}
catch (Exception ex)
{
//value = null;
}
}
它失败,出现以下错误:
The out parameter 'value' must be assigned to before control leaves the current method
但如果我正在取消catch
部分中的作业,它编译成功。
很明显,它也编译我在try
声明之前取消注释。
所以问题是为什么它不足以在try块中初始化参数out
?为什么我不得不在catch
模块中进行初始化?
此代码永远不会失败,但编译器在编译时不检查它。 –
@ M.kazemAkhgary:你怎么知道它永远不会失败?在'null'可以存储在变量中之前,必须用'ldnull'将它压入堆栈。没有理由不能导致'StackOverflowException'或其他什么。 –
@DarkFalcon请添加作为答案 - 所有其他答案只是引用语言规范。我正在寻找一个真正的原因,但想不出一个。 – xxbbcc