c# - 接口(interface)成员中定义的可空引用类型在实现中不需要为可空的原因是什么?

从 C# 8.0 开始,我可以这样做:

interface IMyInterface
{
#nullable enable
    void DoSomething(string? withValue);
#nullable disable
}

即使用可空引用类型参数 string? withValue,但是当我实现接口(interface)时,这是完全合法的——事实上,当 VS 中的工具自动生成实现代码时,结果如下:

class MyImpl : IMyInterface
{
    public void DoSomething(string withValue)
    {
        throw new NotImplementedException();
    }
}

我特别希望实现为 withValue 参数要求一个可为空的引用类型,那么为什么不需要呢?能够在接口(interface)中定义可为 null 的引用类型参数有什么意义?

最佳答案

why isn't it required?

这不是必需的,因为当您编译接口(interface)的实现时,您没有启用可空引用类型。

当可空引用类型检查未启用时,关于可空引用类型的任何都不会生效。您明确表示,在未启用它的代码上下文中,您不希望编译器提供可空引用类型的编译时强制执行。

所以,事实并非如此。就好像类型的可空性根本不存在。

What is the point of being able to define a nullable reference type argument in an interface?

出于同样的原因,您可以为任何方法定义可为空的引用类型参数。为了表明,当启用可空引用类型检查时,调用者可以传递 null 作为参数的值。

这样,如果您在启用可为空引用类型检查的上下文中编译实现或使用该接口(interface)的代码,您收到有关类型与实现不匹配的预期警告。这反过来应该让您意识到您的实现规定参数必须是非空值,而实际上,当通过接口(interface)而不是直接在实现中调用成员时,代码可以传递空值。

请注意,仅当使用不可为 null 的引用类型声明实现并且使用可为 null 的引用类型声明接口(interface)时才会出现警告,因为这是唯一危险的组合。当接口(interface)声明为不可空且实现声明为可空时,这是非常安全的,不会发出警告。

接口(interface)的作者不一定知道在实现甚至使用接口(interface)时是否启用可空引用类型检查。因此,当然可能存在参数的可空性并不重要的情况。但是当可空引用类型检查有用时,即启用时,它的每一点都与可空引用类型一样有用。

这就是能够在接口(interface)中定义可为 null 的引用类型参数的意义所在。

https://stackoverflow.com/questions/65222070/

相关文章:

r - 作为二进制变量处理

c++ - FetchContent 与 ExternalProject

powershell - Unity.exe 命令行构建需要 10 分钟,而编辑器只需不到一分钟

google-workflows - 如何在工作流中获取执行ID

javascript - 如何通过输入字段更改 slider ?

postgresql - 忽略 JetBrains 中的 extra_float_digits 参数

google-apps-script - 无法获取部署 ID 错误的详细信息

ios - 使用 NSPersistentCloudKitContainer 处理重复项

type-conversion - terra 包的函数 rast 不适用于 RasterLayer

python - ImportError : numpy. core.multiarray 导入失败