NotNullIfNotNull属性使用差异

问题描述 投票:0回答:1

我有一个简单的扩展方法,可以将第一个字母大写,或者如果输入为 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
我的用法有什么用?如果它没有做任何事情那么为什么可以这样使用该属性?

c# .net
1个回答
0
投票

NotNullWhen
是一个后置条件,描述参数的退出状态,因此它修饰参数。

NotNullWhenNotNull
是一个后置条件,描述返回值的退出状态,因此它装饰该方法。

© www.soinside.com 2019 - 2024. All rights reserved.