鉴于我有以下接口(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;
即使
DataTable
和 string
继承自 object
,您也不能这样做。要在不通过继承相关的类型之间进行转换,您必须定义 conversion operators关于c# - 为什么我不能将对象强制转换为受约束的泛型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33035168/