使用未赋值的局部变量'_tr'
本文关键字:tr 局部变量 赋值 | 更新日期: 2023-09-27 18:02:29
bool _Error = false;
ThesResult _tr;
try { _tr = engine["en"].LookupSynonyms(_Word, true); }
catch (Exception)
{
_Error = true;
}
if (_Error)
{
_Synonyms.Add(word);
}
else
{
List<string> SynonymNew = new List<string>();
foreach (ThesMeaning meaning in _tr.Meanings)
错误发生在底线_tr.含义。我不知道如何解决这个问题,一切似乎都是好的逻辑,但我需要找到一种方法,使编译器看到。
我将继续说,也许您需要重新考虑您的操作顺序。try... catch (set flag) if(flag)
接近于反模式。这样做有几个很好的理由:
- 这不是写代码的最清晰的方式
- 你没有这样分配额外的内存
你正在使用一个更少的变量(我的猜测是_Error不在其他地方使用)
bool _Error = false; // ThesResult _tr; <!-- only needed in the try block. try { ThesResult _tr = engine["en"].LookupSynonyms(_Word, true); List<string> SynonymNew = new List<string>(); // no worries about initializing it to null. foreach (ThesMeaning meaning in _tr.Meanings) // your loop and the rest of the function. } catch (Exception) { _Synonyms.Add(word); // is this supposed to be _Word? }
声明_tr
时设置为null
。编译器发现它有可能没有被初始化。
必须在使用_tr之前赋值。如果你想从一个没有水的接受者那里喝水,那么你就什么都没喝,不是吗?
在你的代码的try部分,它不能保证它会得到_tr的值,所以你必须在使用它之前自己初始化变量,至少是null。
您至少需要在使用对象之前将null
分配给它们:
bool _Error = false;
ThesResult _tr = null;
try { _tr = engine["en"].LookupSynonyms(_Word, true); }
catch (Exception)
{
_Error = true;
}
if (_Error)
{
_Synonyms.Add(word);
}
else
{
List<string> SynonymNew = new List<string>();
foreach (ThesMeaning meaning in _tr.Meanings)
c#要求您保证在尝试使用变量之前已为其赋值。在这种情况下,如果LookupSynonyms
方法抛出异常,那么_tr
将永远不会获得值,甚至null
也不会。
所以它不会让你编译,除非你能保证你在使用变量之前至少分配了一些东西(甚至是null
)。
这不同于其他一些语言(VB)自动将变量初始化为默认值(如null或0或其他),或其他语言(c++),变量开始时是垃圾(无论当时内存地址中发生了什么)。
初始化set _tr = null
ThesResult _tr = null;