【发布时间】:2015-09-04 18:46:00
【问题描述】:
我注意到 C# 编译器 (.NET 4.5.2) 不允许我编译以下代码:
public void Test(out string value)
{
//value = null;
try
{
value = null;
}
catch (Exception ex)
{
//value = null;
}
}
它失败并出现以下错误:
out 参数 'value' 必须在控制离开之前分配给 当前方法
但如果我取消注释 catch 部分中的分配,它编译成功。
显然,当我在 try 语句之前取消注释赋值时,它也会编译。
所以问题是为什么在 try 块中初始化 out 参数是不够的? 为什么我还要在 catch 块中进行初始化?
【问题讨论】:
-
这段代码永远不会失败,但编译器不会在编译时检查它。
-
@M.kazemAkhgary:你怎么知道它永远不会失败?在将
null存储在变量中之前,必须使用ldnull将其压入堆栈。没有理由不能导致StackOverflowException或其他东西。 -
@DarkFalcon 请添加它作为答案 - 所有其他答案都只是引用语言规范。我一直在寻找一个真正的原因,但想不出一个。
标签: c# .net compiler-errors out