【发布时间】:2020-11-30 14:32:57
【问题描述】:
我最近更新了一个项目以利用 C# 8 可空引用类型功能。解决方案中的所有内容都按预期工作,除了一个自定义 Guard 类,该类是为了减少创建 Guard 表达式时所需的击键次数而编写的。下面是 Guard 类的一个基本示例:
public static partial class Guard
{
public static void AgainstNull(object? value)
{
if (value == null)
{
throw new ArgumentNullException("The value can not be null");
}
}
}
这里是测试类:
public class Test
{
public object? Data { get; set; }
public void TestMethod()
{
Guard.AgainstNull(Data);
//if (Data == null)
//{
// throw new ArgumentNullException("Data can not be null.");
//}
var text = Data.ToString();
}
}
尝试使用 Guard 类会导致“取消引用可能为空的引用”错误:
但是,如果我使用传统的保护表达式(if (Data == null)),编译器会足够聪明地推断出 Data 属性不会为 null:
public class Test
{
public object? Data { get; set; }
public void TestMethod()
{
//Guard.AgainstNull(Data);
if (Data == null)
{
throw new ArgumentNullException("Data can not be null.");
}
var text = Data.ToString();
}
}
是否可以将嵌套表达式/保护语句与 C# 8 可空引用类型功能一起使用?
谢谢!
【问题讨论】:
-
不确定这是否可行,我在移动设备上,但试试
var text = Data.ToString()!;?在 ToString() 之后使用!。试一试。我认为它被称为 null 抑制运算符。然后,您可以在您的测试类中像这样实例化它:Guard.AgainstNull(Data!);或像我上面建议的那样使用它。 -
现在我想了想,你应该做
Data!.ToString();,因为你想确保 Data 不为空。!对运行时没有影响(这是一件好事 :)),它只影响静态评估。在运行时,表达式Data!的计算结果为基础表达式Data的结果。如果它对您有帮助,请告诉我,我可以在使用计算机后写出更详细的答案。 -
@Joel,对于回复缓慢,我深表歉意。所以自动关闭了我的问题,因为它已经在这里得到了回答:stackoverflow.com/questions/58279704/…这个答案就是我想要的。我将 [NotNull] 属性添加到我的 Guard 类中,静态分析开始按预期工作。
标签: c# types reference nullable guard