为什么不能将可为null的int隐式转换为int?技术原因还是设计选择?

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)

但是如果我定义regularIntint而不是Int32我得到以下错误

无法隐式转换类型'int?' 为“ int”。存在显式转换(您是否缺少演员表?)

我期望int并且Int32可以互换,但是显然在构建C#语言时并未考虑到此功能。

不能定义此操作背后是否有技术原因,是否已做出决定以防止潜在的代码气味?

我知道定义这样的隐式运算符可能会导致某些非常意外的行为,因为从null值到0整数的转换并非在每种情况下都有意义。这个问题更多的是“为什么不能做”比“为什么做这是一个真正的 坏主意”

Ser*_*rvy 11

您所拥有的代码不会添加从.NET的可为null的int到.NET的int的隐式转换。它Int32System名称空间中创建了一个全新的类型,称为,但是由于它与Core.dll位于不同的程序集中,因此它是另一种类型。(看看typeof(int).FullNametypeof(int32).FullName看到它。)

设置了您展示的用于测试此隐式转换的代码,以使其尝试将系统的可为null的类型转换为您自己的新类型,并且由于创建了这种隐式转换,因此成功。当您使用系统类型而不是您自己的新类型时,它会失败,因为这些类型之间没有隐式转换。

您不能从这些类型之一的定义之外为类型创建隐式(或显式)转换,并且由于您无法访问Nullable任一源或.NET Int32 的源,因此无法添加隐式转换。