鉴于我有以下接口(interface)和一个实现它的类:

public interface IAnimal
{
    void Feed();
}

public class Animal : IAnimal
{
    public void Feed()
    {
        // feed
    }
}

当我的 Animal 类实现它时,为什么不能从我的具体类转换为约束为 IAnimal 的泛型?
public class Zoo
{
    private readonly Animal animal = new Animal();

    public TAnimal GetAnimal<TAnimal>() where TAnimal : IAnimal
    {
        return (TAnimal)(this.animal); // This will not compile
    }
}

如果我将动物的字段类型更改为 IAnimal 而不是 Animal 则编译正常:
public class Zoo
{
    private readonly IAnimal animal = new Animal();

    public TAnimal GetAnimal<TAnimal>() where TAnimal : IAnimal
    {
        return (TAnimal)(this.animal); // this compiles
    }
}

或者,如果我在转换为通用 TAnimal 之前对 IAnimal 进行显式转换,那么这也可以正常编译:
public class Zoo
{
    private readonly Animal animal = new Animal();

    public TAnimal GetAnimal<TAnimal>() where TAnimal : IAnimal
    {
        return (TAnimal)((IAnimal)this.animal); // this compiles
    }
}

所以我的问题是 - 为什么第一个版本不起作用?编译器肯定有足够的信息来知道 Animal 实现了 IAnimal,所以考虑到约束,将它强制转换为 TAnimal 是有效的吗?或者我在这里缺少什么?

最佳答案

Animal 继承自 IAnimal 并且 TAnimal 不继承自 Animal ,但也继承自 IAnimal 。如果 A 不继承自 B ,则不能从 B 转换为 A ,它类似于:

DataTable dt = new DataTable();
string str = (string)dt;

即使 DataTablestring 继承自 object ,您也不能这样做。要在不通过继承相关的类型之间进行转换,您必须定义 conversion operators

关于c# - 为什么我不能将对象强制转换为受约束的泛型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33035168/

10-11 19:44
查看更多