为什么 object.ToString 的签名声明它可以 return 空值
Why does the signature of object.ToString state that it can return a null value
我在我们的项目中启用可为空的功能时遇到了这个问题。
在 Net 5.0 中 object.ToString()
的签名是
public virtual string? ToString ();
这是为什么?
notes to Inheritors偶数状态
Your ToString() override should not return Empty or a null string.
那么为什么签名声明可以呢?我找不到任何相关信息。
但我的想法是
- 对于那些没有阅读上面提到的注释和 return 来自他们的 ToString 方法的 null 的人的向后可比性。
- 为了让阅读提到的注释的人忽略它
但是由于我们想将可空特性带来的警告视为错误,现在我们必须在使用 ToString
.
的任何地方添加 !
或空检查
签名保持原样还有其他充分的理由吗?
Backwards comparability for those people who didn't read the note mentioned above and return null from their ToString method.
正是这样:现实世界中有 return null
的 ToString 实现。有关详细信息,请参阅 this discussion。
您会注意到,如果您在 VS 中编写自己的 ToString 方法,return 类型默认为 string
而不是 string?
-- 这是为了鼓励您遵循准则。如果您使用定义自己的 ToString
方法并使用 NRT 的类型,它可能也会 return string
,并且您不需要对其进行 nullcheck。
事实 object.ToString()
returns string?
仅相关:
- 当您将一个对象转换为
object
时,编译器不知道其重写的 ToString
方法实际上是 returns string?
还是 string
- 出于同样的原因,当您使用不受约束的泛型类型时
C c = new C();
string s1 = c.ToString(); // No warning
object o = c;
string s2 = o.ToString(); // Warning
public class C
{
public override string ToString() => "";
}
我在我们的项目中启用可为空的功能时遇到了这个问题。
在 Net 5.0 中 object.ToString()
的签名是
public virtual string? ToString ();
这是为什么? notes to Inheritors偶数状态
Your ToString() override should not return Empty or a null string.
那么为什么签名声明可以呢?我找不到任何相关信息。
但我的想法是
- 对于那些没有阅读上面提到的注释和 return 来自他们的 ToString 方法的 null 的人的向后可比性。
- 为了让阅读提到的注释的人忽略它
但是由于我们想将可空特性带来的警告视为错误,现在我们必须在使用 ToString
.
!
或空检查
签名保持原样还有其他充分的理由吗?
Backwards comparability for those people who didn't read the note mentioned above and return null from their ToString method.
正是这样:现实世界中有 return null
的 ToString 实现。有关详细信息,请参阅 this discussion。
您会注意到,如果您在 VS 中编写自己的 ToString 方法,return 类型默认为 string
而不是 string?
-- 这是为了鼓励您遵循准则。如果您使用定义自己的 ToString
方法并使用 NRT 的类型,它可能也会 return string
,并且您不需要对其进行 nullcheck。
事实 object.ToString()
returns string?
仅相关:
- 当您将一个对象转换为
object
时,编译器不知道其重写的ToString
方法实际上是 returnsstring?
还是string
- 出于同样的原因,当您使用不受约束的泛型类型时
C c = new C();
string s1 = c.ToString(); // No warning
object o = c;
string s2 = o.ToString(); // Warning
public class C
{
public override string ToString() => "";
}