Mat*_*LES 2 c# implicit-conversion
在C#中,没有从int?类型到int类型的隐式转换。
我定义了以下隐式运算符
namespace System
{
public partial struct Int32
{
public static implicit operator Int32(int? v)
{
return (Int32)(v ?? 0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这使我可以编译以下代码
int? nullableInt = 0;
Int32 regularInt = nullableInt;
Run Code Online (Sandbox Code Playgroud)
但是如果我定义regularInt为int而不是Int32我得到以下错误
无法隐式转换类型'int?' 为“ int”。存在显式转换(您是否缺少演员表?)
我期望int并且Int32可以互换,但是显然在构建C#语言时并未考虑到此功能。
不能定义此操作背后是否有技术原因,是否已做出决定以防止潜在的代码气味?
我知道定义这样的隐式运算符可能会导致某些非常意外的行为,因为从null值到0整数的转换并非在每种情况下都有意义。这个问题更多的是“为什么不能做”比“为什么做这是一个真正的 坏主意”
Ser*_*rvy 11
您所拥有的代码不会添加从.NET的可为null的int到.NET的int的隐式转换。它Int32在System名称空间中创建了一个全新的类型,称为,但是由于它与Core.dll位于不同的程序集中,因此它是另一种类型。(看看typeof(int).FullName并typeof(int32).FullName看到它。)
设置了您展示的用于测试此隐式转换的代码,以使其尝试将系统的可为null的类型转换为您自己的新类型,并且由于创建了这种隐式转换,因此成功。当您使用系统类型而不是您自己的新类型时,它会失败,因为这些类型之间没有隐式转换。
您不能从这些类型之一的定义之外为类型创建隐式(或显式)转换,并且由于您无法访问Nullable任一源或.NET Int32 的源,因此无法添加隐式转换。