C# 取消引用可能为空的引用

Rol*_*ain 3 c# asp.net visual-studio-2022 c#-10.0

我对收到的警告感到有些困惑。这是相关代码:

#nullable enable
public partial class FileTable<TItem> : ComponentBase, IDisposable
{
    // bunch of class code

    public async Task FilterColumn(Func<TItem, IComparable>? itemProperty, string? searchString)
    {
        ArgumentNullException.ThrowIfNull(ViewItems);

        if (itemProperty == null)
            return;

        if (searchString == null)
            searchString = string.Empty;

        await Task.Run(() =>
        {
            foreach (var item in ViewItems)
            {
                var property = itemProperty(item.Item);

                if (property == null)
                    continue;

                item.IsVisible = property.ToString().ToLower().Contains(searchString.ToLower());
            }
        });
        StateHasChanged();
    } 
}
Run Code Online (Sandbox Code Playgroud)

我收到警告property.ToString()如您所见,我已经添加了一堆空检查,但似乎没有一个可以消除警告。据我所知,现在是不可能property的。null显然我错过了一些东西......那么什么可能触发这个警告呢?

Mar*_*ell 6

问题是ToString()可以返回null;这是不好的做法,但是:它可以:

namespace System
{
    public class Object
    {
        // ...
        public virtual string? ToString();
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果排除以下错误,错误就会消失:

var s = property.ToString() ?? "";
item.IsVisible = s.ToLower().Contains(searchString.ToLower());
Run Code Online (Sandbox Code Playgroud)

另请注意,使用忽略大小写的比较比强制进行额外的字符串分配更有效:

item.IsVisible = s.Contains(searchString, StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)