为什么我的变量仍然"未初始化"?

And*_*air 6 c#

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;'声明'".我想申报,但是按时完成任务!

Ral*_*rek 3

C# 规范 (5.3.3.14) 的一些背景:

\n\n
\n

对于以下形式的 try 语句 stmt:

\n\n

try尝试块finally块

\n\n

(...)

\n\n

finally-block\n 开头的 v 的明确赋值状态与 stmt\n 开头的 v 的明确赋值状态相同。

\n
\n\n

编辑 Try-Catch-Finally(5.3.3.15):

\n\n
\n

对 try-catch-finally 语句 (...)\n 的明确赋值分析就像该语句是包含 try-catch 语句的 try-finally 语句\n 一样

\n\n

以下示例演示了 try\n 语句 (\xc2\xa78.10) 的不同块如何影响明确赋值。

\n
\n\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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我只是想到了一个更能说明问题的例子:

\n\n
int i;\ntry\n{\n    i = int.Parse("a");\n}\ncatch\n{\n    i = int.Parse("b");\n}\nfinally\n{\n   Console.Write(i);\n}\n
Run Code Online (Sandbox Code Playgroud)\n