当前位置:  开发笔记 > 编程语言 > 正文

C# - 泛型和继承问题

如何解决《C#-泛型和继承问题》经验,为你挑选了2个好方法。

我有继承和泛型的问题.这是解释我的问题的代码:

namespace TestApplication
{
    public class MyClass
    {
        private T field;

        public MyClass(T field)
        {
            this.field = field;
        }
    }

    public class MyIntClass : MyClass
    {
        public MyIntClass(int field)
            : base(field)
        {
        }
    }
}

当我尝试做这样的事情时:

MyClass sth = new MyClass(10);
MyIntClass intsth = (MyIntClass) sth;

我收到强制转换异常:无效的强制转换异常.无法将'TestApplication.MyClass`1 [System.Int32]'强制转换为'TestApplication.MyIntClass'.

更有甚者,我无法创建强制转换运算符:

public static implicit operator MyIntClass(MyClass myClass)

因为:'TestApplication.MyIntClass.implicit运算符TestApplication.MyIntClass(TestApplication.MyClass)':不允许在基类之间进行用户定义的转换

我需要创建如上所述的强制转换.我不知道为什么我不能从基类类型转换.我怎么解决这个问题?提前致谢.

编辑

谢谢你的回答.现在我看到我无法从基类转换为派生类,我发现它与泛型没有任何关系.但为什么我不能从基类创建用户定义的转换?我有一个返回基类的方法.我能够定义转换方法,但创建一个转换操作符imho将是一个更好的解决方案.



1> Mehrdad Afsh..:

如果对象实际上是派生类的类型,则只能从基类转换为派生类.我的意思是,你不能将base(MyClass)的实例强制转换为MyIntClass.但是,如果它实际上是MyIntClass存储为MyClass实例的类型,则可以将其强制转换.

MyClass foo = new MyIntClass();
MyIntClass bar = (MyIntClass)foo; // this works.

假设:

class Base {
   int x;
}

class Derived : Base {
   int y;
}

Base foo = new Base();
Derived bar = (Derived)foo;

如果它被允许,它的价值bar.y是多少?实际上,转换DerivedBase完全不是转换.它只是告诉编译器让类型的变量Base指向一个类型的对象Derived.有可能因为派生具有更多或相同的特征Base,而不是相反的情况.

如果您能够在基类和派生类之间创建转换运算符,则C#编译器将无法将其与为它们定义的内置关系区分开来.这就是您无法沿继承层次结构创建转换运算符的原因.



2> Jon Skeet..:

到目前为止,其他答案都是正确的,但我想指出你的例子与泛型无关.它相当于:

using System;

class Base {}
class Child : Base {}

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

        // This will throw an exception
        Child c = (Child) b; 
    }
}

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有