使用未赋值的局部变量'_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.含义。我不知道如何解决这个问题,一切似乎都是好的逻辑,但我需要找到一种方法,使编译器看到。

使用未赋值的局部变量'_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;