出现警告的代码:
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,但我不明白这里有什么问题。
答案 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);
}