c# - 使用基类调用泛型无法从基类转换为 T

标签 c# generics

我有以下设置,似乎我的对象无法转换为通用类型。虽然它实际上是基类。为什么这不起作用?这对我来说似乎很合乎逻辑。

public class AList<T> where T : A
{
    void DoStuff(T foo)
    {
    }

    void CallDoStuff()
    {
        DoStuff(new A()); // ERROR: Cannot convert A to T
    }
}

public class A
{
}

最佳答案

这里的问题是约束说 T必须是 A 或派生自 A 的类.
现在,当您实例化 AList 时用具体的类型,T是一个非常具体的类。如果你没有实例化 AListA本身,但有一个子类,TA 的子类.

您不能将具有基类运行时类型的实例转换为其子类之一,因为它会丢失子类添加的所有信息。

例子:

public class Animal
{
    public int Foo { get; set; }
}

public class Cat : Animal
{
    public int Bar { get; set; }
}

Derived d = new Base();

您希望该代码有效吗?当然不是,因为一个Cat也是一个Animal但是一个Animal不是 Cat .
如果您希望上面的代码真正起作用,请问问自己执行以下代码时会发生什么:d.Bar = 42;
Animal不包含 Bar 的定义.

同样的情况也发生在您的代码中 - 只是游戏中的泛型更加模糊了一点。

关于c# - 使用基类调用泛型无法从基类转换为 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14934924/

相关文章:

c# - 如何在运行时确定变量的类型

java方法返回类型

Java 'T extends' 'hello-world' 无法编译

c# - WinForms 多行文本框 : how to paint small image in the corner of TextBox?

c# - 将文件从 C# 发布到 ASP.Net

c# - Dynamics CRM SDK Context.SaveChanges 权限错误

c# - XAML 矩形属性触发器问题

c# - .NET 的小数 FFT 库

java - Java 中的泛型(和通配符)

c# - 确定派生类是否实现了以自身作为泛型参数的泛型接口(interface)