在 C# 中,没有从int?
键入int
type.
我定义了以下隐式运算符
namespace System
{
public partial struct Int32
{
public static implicit operator Int32(int? v)
{
return (Int32)(v ?? 0);
}
}
}
这允许我编译以下代码
int? nullableInt = 0;
Int32 regularInt = nullableInt;
但如果我定义regularInt
as an int
代替Int32
我收到以下错误
无法隐式转换类型“int”?到“int”。存在显式转换(您是否缺少强制转换?)
我期望int
and Int32
可以互换,但 C# 语言显然在构建时并未考虑到此功能。
无法定义此操作背后是否存在技术原因,是否是为了防止潜在的代码异味而做出的决定?
我知道定义这样一个隐式运算符可能会导致一些非常意外的行为,因为从null
值对一个0
整数并非在所有情况下都有意义。这个问题更多的是关于“为什么不能这样做”而不是“为什么这样做是一个really馊主意”
您拥有的代码没有添加从 .NET 的可为空 int 到 .NET 的 int 的隐式转换。它创建了一个全新的类型,称为Int32
, 在里面System
命名空间,但由于它与 Core.dll 位于不同的程序集中,因此它是不同的类型。 (看一眼typeof(int).FullName
and typeof(int32).FullName
看到这个。)
您展示的尝试测试此隐式转换的代码已设置为尝试将系统的可为空类型转换为您自己的新类型,并且由于您创建了这样的隐式转换,因此它会成功。当您使用系统类型而不是您自己的新类型时,它会失败,因为这些类型之间没有隐式转换。
您无法从这些类型之一的定义之外为类型创建隐式(或显式)转换,并且因为您无法访问其中任一类型的源Nullable
或 .NET Int32,您无法添加隐式转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)