使用未分配的局部变量.但总是落入任务

Bar*_*xto 5 c# try-catch unassigned-variable

有这个代码,我不明白为什么如果在finally块中分配变量不理解它将始终被分配.我想我错过了一个无法分配货币的有效选项.如果你知道,理解为什么会很棒.非常感谢!

谢谢!

CurrencyVO currency;

try
{
     if (idConnection.HasValue && idConnection != 0)
     {
         currencyConnection = client.GetConnection(idConnection.Value);
         model.Connection = currencyConnection;
     }
     else 
     {
         int providerUserKey = (int)Models.UserModel.GetUser().ProviderUserKey;
         currencyConnection = client.GetConnection(providerUserKey);
     }                        
     currency = model.Currencies.SingleOrDefault(c => c.IdCountry == currencyConnection.idcountry) ?? new CurrencyVO();    
} 
catch
{
      currency = new CurrencyVO();                    
} 
finally
{
      model.PublishedContainer.Currency = currency;
}
Run Code Online (Sandbox Code Playgroud)

finally块上发生错误.如果我把它从finally块中取出来像这样:

                } catch {
                    currency = new CurrencyVO();
                }
                model.PublishedContainer.Currency = currency;
Run Code Online (Sandbox Code Playgroud)

它工作正常.

Mic*_*urr 8

C#编译器执行的明确赋值跟踪不一定执行完整分析(在一般情况下这是不可能的) - 有一些规则限制编译器将执行的分析的复杂程度.finally这里有关于该块的规则记录在http://msdn.microsoft.com/en-us/library/aa691181.aspx:

对于表单的try语句stmt:

try try-block finally finally-block

  • 的明确赋值状态v之初试块相同的明确赋值状态v之初语句.
  • 的明确赋值状态v之初最后块相同的明确赋值状态v之初语句.
  • ...

因此,对于您的特定示例,由于currency未在try块的开头明确赋值,因此在块的开头处将其视为未明确赋值finally.