Path.GetExtension(file.FileName)给出可能的空引用警告



当我添加".ToLowerInvariant()"对于Path.GetExtension(file.FileName), ReSharper给出了一个可能的Nullreference异常的警告。

我已经试过了,但是警告没有消失。我错过了什么?

if (file != null && Path.GetExtension(file.FileName) != null)
            {
                switch (Path.GetExtension(file.FileName).ToLowerInvariant())
                {
                    case ".jpg":
                    case ".png":
                    case ".gif":
                    case ".jpeg":
                        break;
                    default:
                        break;
                }
}

因为ToLowerInvariant()是在Path.GetExtension()的结果上调用的。不能保证Path.GetExtension()将返回任何有意义的内容(if文件)。文件名为空(例如)。

最好检查路径的结果。GetExtension不是空的,在你调用它之前。(或调用文件上的ToLower())。文件名,在你把它放入GetExtension()之前,无论哪种方式,确保你确切地知道你放入GetExtension()的内容,否则你不能保证你得到的将是你想要的)。

所以MSDN说GetExtension只会返回null如果你传入的FileName是null

指定路径的扩展名(包括句点"。"),或none [Null]或String.Empty。如果path为none [Null],则返回GetExtension(空)。如果path没有扩展信息,则使用GetExtension返回String.Empty。

如果你先检查if (file != null && file.FileName != null),你就安全了。

你也可以用

让这个警告消失。
if (file != null) 
{
    string extension = Path.GetExtension(file.FileName);
    if (extension != null) //will be null if file.FileName is null
    {
        switch(extension.ToLowerInvariant())
        { 
          //..snip
        }
    }
}

听起来像是一个错误的警告。

所以听起来像ReSharper不理解Path.GetExtension(file.FileName)在你的测试和ToLowerInvariant中使用的时间之间不会改变。

这是一个更明确的警告,您只需要检查是否为空。

下面是一个例子:

var extension = Path.GetExtension(myFile.FileName);
if (extension == null || extension.ToLower() != ".jpg")
{
    lblOutput.Text = @"The file must have an extension of JPG";
    return;
}

好吧,我有同样的问题,简单的修复是

确保在你的。cshtml文件中表单post方法有

enctype ="多部分/form-data"

<form method="post" asp-for="Upsert" enctype="multipart/form-data">

最新更新