csproj
文件中启用了它,方法是通过以下<Nullable>enable</Nullable>
声明。考虑以下简单的代码。
class SortedList<T> where T : struct, IComparable, IComparable<T>, IConvertible, IEquatable<T>, IFormattable
{
private Node? _node;
private readonly IComparer<T> _comparer = Comparer<T>.Default;
class Node
{
public Node(T value)
{
Value = value;
}
public T Value { get; }
public Node? Next { get; set; }
public override string ToString()
{
return Value.ToString();
}
}
//rest of code, that isn't important
}
这行代码 return Value.ToString();
给我一个 CS8603 可能的空引用返回 警告,我的问题是为什么会出现这个警告?
我使用了 where T : struct, IComparable, IComparable<T>, IConvertible, IEquatable<T>, IFormattable
泛型约束来匹配数字类型,Value
实际上是值类型,而不是引用类型。也没有任何值类型的重载 ToString()
方法,默认的 实现 例如对于 Int32
返回的是非空的 string
。MSDN 继承者注意事项 也说:
你的
ToString()
重写不应该返回Empty
或者null
字符串。
编译器是否抱怨某些类型,这些类型可以满足通用约束并从 ToString()
返回 null
?
我可以通过使返回类型可空来避免警告。
public override string? ToString()
{
return Value.ToString();
}
或通过使用 null 合并运算符
public override string ToString()
{
return Value.ToString() ?? "";
}
或者使用空值忽略运算符
public override string ToString()
{
return Value.ToString()!;
}
但这些选项看起来大多像是把戏,我正在寻找对此行为的解释,它是出于设计还是其他原因发生的?除了上述方法之外,是否有任何避免警告的方法?
顺便说一句,这个选项不起作用,警告仍然存在。
[return: MaybeNull]
public override string ToString()
{
return Value.ToString();
}
我正在使用.NET Core 3.1和VS 2019 16.4.2,但我认为这并不是很重要。 提前感谢您的帮助!
ToString
方法不应该返回空字符串,应该返回有意义的内容。 - Trevor