在C#中,不存在从int?
类型到int
类型的隐式转换。
我定义了以下隐式运算符
namespace System
{
public partial struct Int32
{
public static implicit operator Int32(int? v)
{
return (Int32)(v ?? 0);
}
}
}
,它允许我编译以下代码
int? nullableInt = 0;
Int32 regularInt = nullableInt;
但是,如果我将regularInt
定义为int
而不是Int32
,则会得到以下错误
不能隐式转换类型'int?‘到“int”。存在显式转换(是否缺少强制转换?)
我原以为int
和Int32
是可互换的,但是C#语言显然还没有考虑到这个功能。
定义此操作的不可能背后是否有技术原因,这是否是为了防止潜在的代码嗅探而作出的决定?
我知道,定义这样一个隐式运算符可能会导致一些非常意外的行为,因为从null
值到0
整数的转换并不是在每种情况下都有意义的。这个问题更多的是关于“为什么不能做”,而不是“为什么这么做是一个非常糟糕的想法”。
发布于 2019-05-28 16:01:14
作为文档化的这里,只有保存转换,隐式类型转换才是可能的。
以前的例子
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
在您的例子中,int
或Int32
可能被保存为int?
,但反之亦然。
这同样适用于类型层次结构。
class A {}
class B : A {}
class C : A {}
A var1 = new A(); // Compiles
A var2 = new B(); // Compiles (implicit cast)
B var3 = new B(); // Compiles
// need for explicit cast because instance2 can could also be A or C
B var4 = (B) instance2;
// Throws InvalidCastException
C var5 = (C) instance2;
https://stackoverflow.com/questions/56345723
复制相似问题