基于这个问题
有一段我翻译成c#8的旧代码,里面有方法
void MethodName<T>(T value) => ...
и много вызовов вида
MethodName(null);
它可以接受类和结构,这意味着我们不能这样做
void MethodName<T?>(T? value) => ...
因为它需要指定类型 T,而我们无法指定 T: class, struct
打电话时必须按警告
#nullable disable
MethodName(null)
#nullable enable
但事实证明它有效
MethodName(null!)
这是正常的吗?这是一个编译器错误(毕竟是测试版)吗?或者 !这是否不仅意味着“我确定它不为空”,而是更广泛的“这个值很好,通过”?
根据文档中的一个示例,后缀运算符
!
可用于显示您对使用空引用的意识(包括直接由文字表示的引用null
)。!(null-forgiving) 运算符(C# 参考)
最后一段的翻译:
所以这不是编译器缺陷,而只是用例之一。例如,在单元测试中测试方法的行为。