C# 为什么我会得到一个;“表达永远真实”;警告

C# 为什么我会得到一个;“表达永远真实”;警告,c#,C#,出现警告的代码是: public async Task<Metadata> GetFolderAsync(string strDirectoryPathName, dynamic varKnownFolder = null) { using (await _FolderPathToInfoMapSync.EnterAsync().ConfigureAwait(false)) { Metadata objFolder; string st

出现警告的代码是:

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;
}
public异步任务GetFolderAsync(字符串strDirectoryPathName,动态varKnownFolder=null)
{
使用(wait_FolderPathToInfoMapSync.EnterAsync().ConfigureWait(false))
{
元数据文件夹;
字符串strPathName=strDirectoryPathName;
if(varKnownFolder==null)
{
objFolder=wait_Storage.Client.Files.GetMetadataAsync(strPathName);
}
其他的
{
//这里出现了警告
如果(varKnownFolder!=null)\u folderPathToInfo.Add(strDirectoryPathName,varKnownFolder);
else objFolder=null;
}
}
返回objFolder;
}

我的意思是,这是因为方法签名中有一个varKnownFolder,但我不明白这里出了什么问题

如果代码进入第一个else块,则表示
(varKnownFolder==null)
的计算结果为false

因此,第二个检查是无用的,因为
varKnownFolder
在此块中永远不能为null

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异步任务GetFolderAsync(字符串strDirectoryPathName,动态varKnownFolder=null)
{
使用(wait_FolderPathToInfoMapSync.EnterAsync().ConfigureWait(false))
{
元数据文件夹;
字符串strPathName=strDirectoryPathName;
if(varKnownFolder==null)
{
//如果varKnownFolder为null,则会发生这种情况
objFolder=wait_Storage.Client.Files.GetMetadataAsync(strPathName);
}
其他的
{
//代码在这里输入,因为varKnownFolder不为null
如果(varKnownFolder!=null)//
“if”语句检查是否有空对象。
在“else”中,
varKnownFolder
不能为空

我的意思是,这是因为方法签名中有一个varKnownFolder


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

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

if(x==false)
{

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

编译器很聪明,发现了你的错误,然后警告你

 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);
  }

你会得到“表达永远真实”在
varKnownFolder!=null
上,因为表达式
varKnownFolder!=null
总是正确的!:)这是我一直听到的最好的说法。谢谢=)你不需要在最后一个代码段中将
objFolder
初始化为
null
吗?objFolder在这段代码中不可读。因此,将
objFolder
初始化为null是无用的。它是作为函数的结果返回的。对!!所以它应该初始化为null。编辑。无论如何OP中的作用域是错误的。从技术上讲,你甚至不需要变量,
if
可以
返回wait…
,然后你可以在那里删除
else
返回null
。但是这可能是部分个人偏好,所以让我们尽可能地坚持OP的代码。
 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);
  }