如果我有此代码,它将按应有的方式编译和工作:
class MyNumber // Just a class.
{
static public explicit operator MyNumber(byte b)
{
return new MyNumber();
}
}
Decimal d = new Decimal();
MyNumber c1 = (MyNumber)d;
也许有些人有点惊讶,因为从 adecimal
到没有现成的显式转换MyNumber
。但是由于有一个从decimal
to的显式转换byte
,也有一个从 a 的显式byte
转换MyNumber
,所以编译器很友好地为我插入了那个额外的显式转换。
简而言之:如果程序员使用显式转换,编译器可以自由搜索其他显式转换以使整个事情顺利进行。
所以......我在自己的课程中尝试了同样的事情。而不是byte
and decimal
,我使用MyByte
and Mydecimal
。代码如下所示:
class MyDecimal // Simulates a decimal.
{
static public explicit operator MyByte(MyDecimal a) // Just like in a decimal.
{
return new MyByte();
}
}
class MyByte // Simulates a byte.
{
}
class MyNumber // Just a class.
{
static public explicit operator MyNumber(MyByte b)
{
return new MyNumber();
}
}
MyDecimal d = new MyDecimal();
MyNumber c2 = (MyNumber)d; // <== Will not compile!
最后一行不会编译。它给出了错误:“无法将类型 'DoubleExplicitCasts.Program.MyDecimal' 转换为 'DoubleExplicitCasts.Program.MyNumber'”。嗯……为什么不???
所以我的问题是:为什么 .NET 系统中的显式运算符得到特殊处理而我的用户显式运算符没有?
编辑
我知道这段代码不起作用,并且值不会从一个实例转移到另一个实例,但这无关紧要。