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

有这个代码,我不明白为什么如果在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; } 

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

  } catch { currency = new CurrencyVO(); } model.PublishedContainer.Currency = currency; 

它工作正常。

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

对于表单的try语句stmt

try try-block finally 终于阻止

  • try-block开头的v的明确赋值状态与stmt开头的v的明确赋值状态相同。
  • finally块的开头的v的明确赋值状态与stmt开头的v的明确赋值状态相同。

因此,对于您的特定示例,由于currency未在try块的开头明确赋值,因此它被认为在finally块的开头没有明确赋值。

如果new CurrencyVO()catch块中导致exception怎么办? A-HA!

您可以在不符合语言规范的情况下推理出来。 这里的失败模式是catch块中的语句可以抛出exception。 很可能,在C#中支持在构造函数中抛出exception。 但总的来说,任何语句都可以抛出exception。 这将使变量未初始化。 finally块中的赋值将始终执行。 在这种情况下使用未初始化的变量。

如果它完全相关的话,你需要考虑在这种情况下你会发生什么。 但显而易见的解决方法是简单地将变量初始化为null。

您正在catch块中创建一个新的CurrencyVO对象:只有在出现错误/exception时才会执行该对象。 因此,如果您没有遇到任何exception: currency变量将不会被分配。 这就是你不能使用它的原因。

编辑:对要编译的代码进行以下更改:

 CurrencyVO currency = null; 

最后:

 if (currency != null) model.PublishedContainer.Currency = currency; 

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/a994a0ff-432b-4d23-b7d2-838b0b961de0