![](/img/trans.png)
[英]Why can't you cast a constrained open generic typed to the constrained type?
[英]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是有效的吗? 或者我在这里缺少什么?
假设你还有一个类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;
}
}
你可以从Animal
为IAnimal
,从IAnimal
为Dog
,但它会抛出InvalidCastException
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.