繁体   English   中英

为什么我不能将对象强制转换为约束泛型?

[英]Why can't I cast an object to a constrained generic?

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

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继承自IAnimalTAnimal不继承自Animal ,也来自IAnimal 如果B不从A继承,则不能从AB ,它将类似于:

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

即使DataTablestringobject继承,也不能这样做。 要通过继承转换不相关的类型,您必须定义转换运算符

假设你还有一个类Dog

public class Dog : IAnimal 
{

} 

如果你使用Dog作为TAnimal调用你的方法: GetAnimal<TAnimal>() ,你将得到如下代码:

public class Zoo
{
    private readonly Animal animal = new Animal();

    public Dog GetAnimal()
    {
        return (Dog)this.animal;
    }
}

当然Dog不会继承Animal所以施法是错误的。

然后你有第二个例子:

public class Zoo
{
    private readonly IAnimal animal = new Animal();

    public Dog GetAnimal()
    {
        return (Dog)this.animal;
    }
}

Dog正在实现IAnimal ,所以这将编译。 但是它会在运行时抛出InvalidCastException 同样的事情适用于第三个例子中的双重投射:

public class Zoo
{
    private readonly Animal animal = new Animal();

    public Dog GetAnimal()
    {
        return (Dog)(IAnimal)this.animal;
    }
}

你可以从AnimalIAnimal ,从IAnimalDog ,但它会抛出InvalidCastException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM