【发布时间】:2020-04-23 09:59:01
【问题描述】:
我正在使用 c# 8 中的可为空类型,但我发现了一个困扰我的问题。 假设我有一个采用可为空参数的方法。当参数为空时,我想抛出一个特定的异常。但我希望该方法干净并在其他地方检查参数。 check 方法抛出异常,所以方法后面的参数不能为空。 不幸的是,编译器没有看到这一点并向我发出警告。 方法如下:
public void Foo(string? argument)
{
GuardAgainst.Null(argument, nameof(argument));
string variable = argument; // <-- Warning CS8600 Converting null literal or possible null value to non - nullable type
var length = argument.Length; //<--Warning CS8602 Dereference of a possibly null reference
}
检查方法如下:
public static void Null(string? text, string paramName)
{
if (text == null)
throw new ArgumentNullException(paramName);
}
现在,我可以像这样抑制警告:
#pragma warning disable CS8602
var length = argument.Length;
#pragma warning restore CS8602
但这有点扼杀了我保持代码清洁的意图。 所以我的问题是:有没有更好的方法来抑制警告?或者也许告诉编译器从现在开始保证参数不为空?
【问题讨论】:
-
为什么不使用简单的
if .. != null声明? -
你不能让
Null返回一个不可为空的字符串并将其作为分配给variable的一部分调用吗? -
当然,我想过。然后我会有 var variable = GuardAgainst.Null(parameter, nameof(parameter));所以我必须为我拥有的每个参数创建一个变量。这是迄今为止最干净的解决方案,但我想知道是否有更好的选择
-
This is the cleanest solution so farGuardAgainst 和.Null()的实现。虽然最终取决于具体情况,但有些人可能会认为这不是很干净,特别是当替代方案是在if语句中进行简单的null检查时。在这种情况下,clean对您意味着什么?是什么让clean的解决方案比任何其他解决方案或多或少?
标签: c# .net-core-3.0 nullable-reference-types