为什么 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 中永远不会发生多重隐式转换。 int
和 int?
是完全不同的类型,只有 C# 编译器让您认为它们可以很好地协同工作——这只是语法糖。当您只是调用 returns object
:)
的随机方法时,语法糖不起作用
如果您需要此功能,只需编写您自己的始终 return 可为 null 的包装器即可。
如果我运行下面的代码:
(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 中永远不会发生多重隐式转换。 int
和 int?
是完全不同的类型,只有 C# 编译器让您认为它们可以很好地协同工作——这只是语法糖。当您只是调用 returns object
:)
如果您需要此功能,只需编写您自己的始终 return 可为 null 的包装器即可。