0
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.Meanings。我不知道如何解决这个问题,逻辑上一切似乎都还可以,但我需要找到一种方法让编译器看到这一点。

4

6 回答 6

3

我要继续说,也许您可​​能想重新考虑您的操作顺序。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?
    }
    
于 2013-03-06T15:57:03.913 回答
2

声明时设置_tr为。null编译器发现它可能没有被初始化。

于 2013-03-06T15:52:23.953 回答
1

您必须在使用它之前分配_tr的值。如果您想从没有水的接受者那里喝水,那么您什么都没有喝,是吗?

在代码的 try 部分中,它不能保证它将获得_tr的值,因此您必须在使用它之前自己初始化变量,至少使用 null。

于 2013-03-06T15:51:49.227 回答
1

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)
于 2013-03-06T15:52:40.350 回答
1

C# 要求您保证在尝试使用变量之前已为其分配了一个值。在这种情况下,如果LookupSynonyms方法抛出异常,则_tr永远不会得到值,甚至null.

所以它不会让你编译,除非你能保证在你使用它之前你至少已经为null变量分配了一些东西(甚至)。

这与其他一些语言 (VB) 不同,它自动将变量初始化为其默认值(如 null 或零或其他),或者其他语言 (C++) 变量开始为垃圾(无论发生在该内存地址中的什么)时间)。

于 2013-03-06T15:54:27.363 回答
0

初始化时 set _tr = null

ThesResult _tr = null;
于 2013-03-06T15:53:22.157 回答