可空引用类型和实现接口

Nullable reference type and implementing interfaces

当对 INotifyPropertyChanged 界面使用“实现界面”快速操作时,我得到了

class Test : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;
}

可空引用类型是预期的,这迫使我使用 ?.Invoke() 而不是获取 NullReferenceException.

但是 IValueConverter 是:

class Converter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我希望到处都能看到 object? 方法参数和 return 类型。为什么不是?

我应该手动进行此更改吗?


我注意到的另一件事:

interface IA
{
    object? Test(object? arg);
}

class A : IA
{
    public object? Test(object? arg)
    {
        throw new NotImplementedException();
    }
}

interface IB
{
    object Test(object arg);
}

class B : IB
{
    public object Test(object arg)
    {
        throw new NotImplementedException();
    }
}

表示“实现接口”快速操作仅遵循接口定义中的方法签名。这是否意味着所有标准库接口的签名都需要更新?

我正在使用 VS2022 预览版 4 和 .Net 6.0 顺便说一句。

Does this means that the signature of all standard library interfaces needs to be updated?

是的,确实如此。

来自Microsoft's documentation

The .NET runtime APIs have all been annotated [for null-state static analysis] in .NET 5. You improve the static analysis by annotating your APIs to provide semantic information about the null-state of arguments and return values.

这就是您看到 PropertyChangedEventHandler? 的原因 INotifyPropertyChanged;它已更新为包含所述注释。

不过,IValueConverterInterface 的最新版本是 Windows Desktop 5。从该页面,您可以看到它尚未更新以利用可空引用类型。