我有一个简单的扩展方法,可以将第一个字母大写,或者如果输入为 null 或空则返回 null
public static string? Capitalize([NotNullIfNotNull(nameof(s))] this string? s)
{
if (s.NullOrWhiteSpace())
return null;
return string.Create(s.Length, s, (chars, state) =>
{
state.AsSpan().CopyTo(chars); // No slicing to save some CPU cycles
chars[0] = char.ToUpper(chars[0]);
});
}
还有另一种简单的扩展方法
public static bool NullOrWhiteSpace([NotNullWhen(false)] this string? value)
{
return string.IsNullOrWhiteSpace(value);
}
如您所见,我正在使用属性
NotNullWhen
和 NotNullIfNotNull
。
NotNullWhen
没有问题,但 NotNullIfNotNull
的工作方式不同:
string cap = "abc".Capitalize();
产生警告
CS8600 - Converting null literal or possible null value to non-nullable type.
如果我将 Capitalize 方法的属性用法切换为
[return: NotNullIfNotNull(nameof(s))]
public static string? Capitalize(this string? s)
{
...
然后警告就消失了。 为什么使用上会有差异?如果没有
return
我的用法有什么用?如果它没有做任何事情那么为什么可以这样使用该属性?
NotNullWhen
是一个后置条件,描述参数的退出状态,因此它修饰参数。
NotNullWhenNotNull
是一个后置条件,描述返回值的退出状态,因此它装饰该方法。