为什么 C# 的 System.Convert 可以将 (string) 转换为 (int),但不能将 (string) 转换为 (int?)?

Why can C#'s System.Convert convert (string) to (int), but not (string) to (int?)?

如果我运行下面的代码:

(int)Convert.ChangeType("3", typeof(int))

结果是3。厉害了。

如果我把它改成:

(int?)Convert.ChangeType("3", typeof(int?))

结果是

Invalid cast from 'System.String' to 'System.Nullable`1 [[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

但是,它处理得很好:

(int?)Convert.ChangeType("3", typeof(int))

为什么它不能直接处理到可空 int 类型的转换?

Convert.ChangeType 早于 .NET 中的可空值,因此它不可能是 hack。现在几乎没有理由使用 Convert

为什么这是黑客攻击?那么,您要求 Convert 连续执行多个转换,同时还意识到错误的值应该在 "real" return 值中表示为 null。 .NET 中永远不会发生多重隐式转换。 intint? 是完全不同的类型,只有 C# 编译器让您认为它们可以很好地协同工作——这只是语法糖。当您只是调用 returns object :)

的随机方法时,语法糖不起作用

如果您需要此功能,只需编写您自己的始终 return 可为 null 的包装器即可。