C# 允许使用多个系统显式转换器,但不允许使用多个用户显式转换器。为什么?

C# 允许使用多个系统显式转换器,但不允许使用多个用户显式转换器。为什么?,c#,operators,operator-overloading,explicit,explicit-conversion,C#,Operators,Operator Overloading,Explicit,Explicit Conversion,如果我有这段代码,这段代码将编译并正常工作: class MyNumber // Just a class. { static public explicit operator MyNumber(byte b) { return new MyNumber(); } } Decimal d = new Decimal(); MyNumber c1 = (MyNumber)d; 也许有些人有点惊讶,因为没有从decimal到MyNumber的显式转换。但是

如果我有这段代码,这段代码将编译并正常工作:

class MyNumber // Just a class.
{
    static public explicit operator MyNumber(byte b)
    {
        return new MyNumber();
    }
}

Decimal d = new Decimal();
MyNumber c1 = (MyNumber)d;
也许有些人有点惊讶,因为没有从
decimal
MyNumber
的显式转换。但是,由于有一个从
decimal
byte
的显式转换,也有一个从
byte
MyNumber
的显式转换,编译器非常乐意为我插入这个额外的显式转换

简言之:如果程序员使用显式转换,编译器就可以自由地搜索其他显式转换来完成整个过程

所以。。。我在自己的课堂上也做了同样的尝试。我使用了
MyByte
Mydecimal
而不是
byte
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!
class MyDecimal//模拟十进制数。
{
静态公共显式运算符MyByte(MyDecimal a)//就像在十进制中一样。
{
返回新的MyByte();
}
}
类MyByte//模拟一个字节。
{
}
类MyNumber//只是一个类。
{
静态公共显式运算符MyNumber(MyByte b)
{
返回新的MyNumber();
}
}
MyDecimal d=新的MyDecimal();

MyNumber c2=(MyNumber)d;// 嗯,很简单,因为C#标准就是这样定义的

根据第6.4.3节:

对用户定义的转换进行评估绝不会涉及一个以上的用户定义或提升的转换运算符。换句话说,从类型S到类型T的转换永远不会首先执行从S到X的用户定义转换,然后执行从X到T的用户定义转换

至于他们为什么选择以这种方式限制转换,那是另一回事。我将提出两个可能的原因:

  • 这将允许太多“令人惊讶”的转换
  • 这会使编译过程太慢(可能会出现组合爆炸)
  • 但这只是我的猜测。

    在我看来,这将导致“愉快的调试”,以及非常非常复杂和不明显的代码

    想象一下这样的用户定义转换的3个或多个级别,以及如何在中间转换导致错误(例如,这种转换是错误地引入的,或者不应该在这种情况下使用)。


    谢天谢地,这种行为是不受支持的。

    嗯。。。它是受支持的:对于显式系统运算符。您询问了用户定义的转换,我提到了用户定义的转换。我认为这是清楚的,将添加到回答感谢改变它。除此之外,我不能完全同意你的意见。委托、泛型、LINQ等也可以创建非常复杂的软件进行调试。在我看来,一个好的程序员应该知道如何编写代码和如何调试。我认为(C3的开发人员)当他们认为“他们的”操作符是“好的”和“值得信赖的”,而“我们的”操作符是“难以调试的”时,不允许这样做是自以为是的。我个人不明白为什么它甚至被允许用于内置的显式转换。