为什么我得到一个"表达总是如此"警告?

时间:2015-11-10 10:47:54

标签: c#

出现警告的代码:

public async Task<Metadata> GetFolderAsync(string strDirectoryPathName, dynamic varKnownFolder = null)
{
    using (await _FolderPathToInfoMapSync.EnterAsync().ConfigureAwait(false))
    {
        Metadata objFolder;
        string strPathName = strDirectoryPathName;
        if (varKnownFolder == null)
        {
            objFolder = await _Storage.Client.Files.GetMetadataAsync(strPathName);
        }
        else
        {
            //Here warning arises
            if (varKnownFolder != null) _FolderPathToInfoMap.Add(strDirectoryPathName, varKnownFolder);
            else objFolder = null;
        }
    }
    return objFolder;
}

我的意思是这是方法签名中的varKnownFolder,但我不明白这里有什么问题。

4 个答案:

答案 0 :(得分:9)

如果您的代码进入第一个else块,则意味着(varKnownFolder == null)被评估为false。

所以第二次检查没用,因为varKnownFolder在这个块中永远不会为空。

public async Task<Metadata> GetFolderAsync(string strDirectoryPathName, dynamic varKnownFolder = null)
{
     using (await _FolderPathToInfoMapSync.EnterAsync().ConfigureAwait(false))
     {
           Metadata objFolder;
           string strPathName = strDirectoryPathName;

           if (varKnownFolder == null)
           {
               // This would happen if varKnownFolder is null 

               objFolder = await _Storage.Client.Files.GetMetadataAsync(strPathName);
           }
           else
           {
               // The code enters HERE BECAUSE varKnownFolder is not null

               if (varKnownFolder != null) // <-- So this check is useless
                   _FolderPathToInfoMap.Add(strDirectoryPathName, varKnownFolder);
               else 
                  objFolder = null;
            }

            return objFolder;
      }

}

此外,这意味着您可以将其替换为:

public async Task<Metadata> GetFolderAsync(string strDirectoryPathName, dynamic varKnownFolder = null)
{
     using (await _FolderPathToInfoMapSync.EnterAsync().ConfigureAwait(false))
     {
           Metadata objFolder = null;
           string strPathName = strDirectoryPathName;

           if (varKnownFolder == null)
           {
               objFolder = await _Storage.Client.Files.GetMetadataAsync(strPathName);
           }
           else
           {
               // The code enters HERE BECAUSE varKnownFolder is not null
               _FolderPathToInfoMap.Add(strDirectoryPathName, varKnownFolder);
            }

            return objFolder;
      }

}

答案 1 :(得分:5)

因为您正在检查已由外部if语句声明的块中相同条件的反转。从逻辑上讲,您的代码相当于......

if(x==false)
{

}
else // x must be true here
{
    if(x==true) { }
}

答案 2 :(得分:3)

        if (varKnownFolder == null)
        {
        }
        else
        {
            //You already know it is not null (because of the "if" check)
            if (varKnownFolder != null)
        }

您的“if”语句会检查您是否有空对象 在“else”中,varKnownFolder不能为空。

  

我的意思是这是方法签名

中的varKnownFolder

不,varKnownFolder = null内部方法签名只是意味着,如果你在没有varKnownFolder的情况下调用此方法,它将为null。

答案 3 :(得分:3)

编译器很聪明并且发现了你的错误,然后它会警告你。

 if (varKnownFolder == null)
 {
     // null
 }
 else
 {
     // *** NOT null ***
     if (varKnownFolder != null) _FolderPathToInfoMap.Add(strDirectoryPathName, varKnownFolder);
     else objFolder = null;
}

所以你写的相当于

  if (varKnownFolder == null)
  {
      objFolder = await _Storage.Client.Files.GetMetadataAsync(strPathName);
  }
  else
  {
      _FolderPathToInfoMap.Add(strDirectoryPathName, varKnownFolder);
  }