以下代码会产生警告
Warning CS8600 Converting null literal or possible null value to non-nullable type.
int? a = 1;
string lineCount = a != null ? a.ToString() : string.Empty;
看来是因为
ToString()
返回了string?
。然而,即使将其转换为 string
也不会删除警告。
string lineCount = a != null ? (string)a.ToString() : string.Empty;
但是,如果整数不可为空,则不会产生此警告。
如何摆脱这个警告?
对此有两种解决方案。
首先,您可以确保您在
ToString()
上拨打 int
,而不是 Nullable<int>
:
int? a = 1;
string lineCount = a != null ? a.Value.ToString() : string.Empty;
注意这里使用
a.Value
。这样,编译器就知道您在 int
上调用它,并且正如您在问题中所说,编译器知道 int.ToString()
永远不会返回 null
。 (它声明返回 string
,而不是 string?
...而 Nullable<T>.ToString()
仍然声明返回 string?
。)
此方法的一个变体是使用模式匹配来捕获不可为空的整数:
int? a = 1;
string lineCount = a is int value ? value.ToString() : string.Empty;
第二种方法是将空条件运算符与空合并运算符结合使用:
int? a = 1;
string lineCount = a?.ToString() ?? string.Empty;
我个人会使用它作为一种更简单的方法。