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

C# Dereference of a possibly null reference

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

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

我收到 property.ToString() 的警告 如您所见,我已经添加了一堆空检查,但 none 似乎摆脱了警告。据我所知,此时 property 不可能是 null 。显然我遗漏了一些东西...那么是什么触发了这个警告?

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

namespace System
{
    public class Object
    {
        // ...
        public virtual string? ToString();
        // ...
    }
}

如果您排除这种情况,错误就会消失:

var s = property.ToString() ?? "";
item.IsVisible = s.ToLower().Contains(searchString.ToLower());

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

item.IsVisible = s.Contains(searchString, StringComparison.CurrentCultureIgnoreCase);