我在继承和泛型方面遇到了问题。
这是说明我的问题的代码:

namespace TestApplication
{
    public class MyClass<T>
    {
        private T field;

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

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

当我尝试做这样的事情时:
MyClass<int> sth = new MyClass<int>(10);
MyIntClass intsth = (MyIntClass) sth;

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

而且,我无法创建强制转换运算符:
public static implicit operator MyIntClass(MyClass<int> myClass)

因为:'TestApplication.MyIntClass.implicit运算符TestApplication.MyIntClass(TestApplication.MyClass)':不允许用户定义的向基类或从基类的转换

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

编辑

感谢您的回答。
现在,我看到我无法从基类转换为派生类,并且我发现它与泛型没有任何关系。
但是为什么我不能从基类创建用户定义的转换?我有一个返回基类的方法。我可以定义一种转换方法,但是创建一个强制转换运算符恕我直言将是一个更好的解决方案。

最佳答案

如果对象实际上是类型派生类,则只能将其从基类转换为派生类。我的意思是,您无法将base(MyClass<int>)的实例强制转换为MyIntClass。但是,如果它实际上是作为MyIntClass实例存储的MyClass<int>类型的,则可以将其强制转换。

MyClass<int> 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的值是多少?
实际上,从Derived转换为Base根本不是转换。只是告诉编译器让Base类型的变量指向Derived类型的对象。可能是因为派生的特征比Base的特征更多或相等,反之则不然。

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

09-29 23:47