我在继承和泛型方面遇到了问题。 这是说明我的问题的代码:
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 operator 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
类型的对象.这是可能的,因为 derived 具有比 Base
更多或相等的特征反之则不然。
如果您能够在基类和派生类之间创建转换运算符,C# 编译器将无法将其与为它们定义的内置关系区分开来。这就是为什么不能沿继承层次结构创建强制转换运算符的原因。
关于C# - 泛型和继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/433526/