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);
我对收到的警告感到有些困惑。这是相关代码:
#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);