string foo;
try
{
foo = "test"; // yeah, i know ...
}
catch // yeah, i know this one too :)
{
foo = null;
}
finally
{
Console.WriteLine(foo); // argh ... @#!
}
Console.WriteLine(foo); // but nothing to complain about here
Run Code Online (Sandbox Code Playgroud)
除了它不是BP(捕获路由) - 但这是我能得到的最佳隔离.
但我得到了很好的波浪告诉我"危险,危险 - 可能是未初始化的".怎么会?
编辑:
请不要建议"简单地说string foo = string.Empty;'声明'".我想申报,但是按时完成任务!
C# 规范 (5.3.3.14) 的一些背景:
\n\n\n\n\n对于以下形式的 try 语句 stmt:
\n\ntry尝试块finally块
\n\n(...)
\n\nfinally-block\n 开头的 v 的明确赋值状态与 stmt\n 开头的 v 的明确赋值状态相同。
\n
编辑 Try-Catch-Finally(5.3.3.15):
\n\n\n\n\n对 try-catch-finally 语句 (...)\n 的明确赋值分析就像该语句是包含 try-catch 语句的 try-finally 语句\n 一样
\n\n以下示例演示了 try\n 语句 (\xc2\xa78.10) 的不同块如何影响明确赋值。
\n
class A\n{\n static void F() \n {\n int i, j;\n try {\n goto LABEL;\n // neither i nor j definitely assigned\n i = 1;\n // i definitely assigned\n }\n catch {\n // neither i nor j definitely assigned\n i = 3;\n // i definitely assigned\n }\n finally {\n // neither i nor j definitely assigned\n j = 5;\n // j definitely assigned\n }\n // i and j definitely assigned\n LABEL:;\n // j definitely assigned\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我只是想到了一个更能说明问题的例子:
\n\nint i;\ntry\n{\n i = int.Parse("a");\n}\ncatch\n{\n i = int.Parse("b");\n}\nfinally\n{\n Console.Write(i);\n}\nRun Code Online (Sandbox Code Playgroud)\n