C# - 泛型和继承问题

标签 c# generics inheritance casting

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

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/

相关文章:

使用 AddRange 的 C# 种子私有(private)成员

c# - 企业日志记录不翻译 XML 跟踪监听器文件名规范中的环境变量

java - 将 java 遗留代码转换为泛型——如何用类型替换对象?

C# 将 List<int> 转换为 List<double>

c# - 方法的类型推断,具有泛型和类继承

c# - 强制在基类内部调用基类虚方法

c# - 如何从 .resx 文件条目中获取注释

c# - 如何从 C# 在 SQLite DB 中插入和查询 DateTime 对象?

java - Hibernate,扩展实体 - "java.lang.IllegalArgumentException: Unknown entity"

java - 具有继承的静态 block 的行为