C# 我可以使用显式运算符创建派生类吗?

C# 我可以使用显式运算符创建派生类吗?,c#,.net,inheritance,explicit,C#,.net,Inheritance,Explicit,无法将类型为“ConsoleApplication1.Derived2”的对象强制转换为类型为“ConsoleApplication1.Derived1”。 为什么??我的运算符转换有什么问题?您只能在层次结构上下转换类,而不能跨层次转换类。派生的类2不能从派生的类1继承,这就是失败的原因 以下是有效的: 基d2ConvertedBase=(基)bd2 如果Derived2是从Derived1继承的,那么您尝试的是有效的。问题是没有使用自定义转换,因为bd2的编译时类型是Base,而不是Deri

无法将类型为“ConsoleApplication1.Derived2”的对象强制转换为类型为“ConsoleApplication1.Derived1”。


为什么??我的运算符转换有什么问题?

您只能在层次结构上下转换类,而不能跨层次转换类。

派生的类2不能从派生的类1继承,这就是失败的原因

以下是有效的:

基d2ConvertedBase=(基)bd2


如果Derived2是从Derived1继承的,那么您尝试的是有效的。

问题是没有使用自定义转换,因为
bd2
的编译时类型是
Base
,而不是
Derived2
。编译器甚至没有考虑您的自定义转换,所以它只是包含了一个普通的强制转换,这是由于明显的原因而失败的。(我假设您理解这个失败,否则您就不会创建自定义转换。)

编译器根据操作数的编译时类型选择运算符和转换


虽然您可以先转换到
Derived2
,或者更改
bd2
的声明,但我个人会完全改变策略,重新审视全局。你想做什么,为什么?例如,
Base
中的虚拟方法是否更有意义?

转换为基类。如果要创建一个复杂的类,请考虑实现接口和执行基于接口的编程。p> 查看运营商的签名:

class Base
{
}

class Derived1 : Base
{
}

class Derived2 : Base
{
    public static explicit operator Derived1(Derived2 d2)
    {
        return new Derived1();
    }
}

class Test
{
    static void Main()
    {
        Base bd2 = new Derived2();

        Derived1 d2ConvertedD1 = (Derived1)bd2; //throws InvalidCastException

    }
}
注意它是静态的。您看到的类似于方法重载解析的限制

这与下面输出“对象”而不是“字符串”的原因基本相同:


也就是说,编译器需要在编译时选择一个重载。在从
转换到
派生1
的情况下,没有具有正确签名的重载,因此它会尝试实际的向下转换。正如其他人所提到的,将
bd2
声明为
Derived2
,将通过允许编译器选择自定义转换来“修复”此问题。

我认为您没有抓住问题的关键。OP已经创建了一个自定义操作符来执行转换-但是它没有被调用,这让他很困惑。我想自从我回答它之后,标题可能已经改变了。它已经,但我不认为这个问题发生了很大的变化:)请看我对比约纳斯的评论-重点是没有调用自定义转换。感谢您的澄清。如果没有可爱的C#格式,原始帖子有点难以解读,但我没有理由读得不够透彻。这只是一个抽象的想法,这里没有任何商业用途。我只是想知道更好的铸造操作员(尽管不推荐使用)。感谢您的帮助。现在
dynamic
将更改此:-)
public static explicit operator Derived1(Derived2 d2);
static void WriteObject(object obj) { Console.WriteLine("Object"); }
static void WriteObject(string str) { Console.WriteLine("String"); }

object obj = "I am a string.";
WriteObject(obj);