我有以下课程:
public interface IA
{
}
public class A : IA
{
}
public interface IB<T> where T : IA
{
Foo SomeMethod(T someObject);
}
public abstract class BBase<T> : IB<T> where T : IA
{
// implements SomeMethod();
}
public class BSpecific: BBase<A>
{
// overrides SomeMethod();
}
这会在运行时引发异常:
var foo = ((IB<IA>)Activator.CreateInstance("BSpecific"));
System.InvalidCastException:无法转换类型B的对象特定于类型IB'1 [IA]
投射到BBase会引发相同的异常。
Why I am getting the Unable to cast exception here是非常相似的情况,但是由于SomeMethod()的参数为T,因此建议的答案(使用contravariance /“ out T”)不适用于我的情况。
我不太确定为什么我需要变数(或确切的变数是什么)。类型和类都被强制转换为它们实现的接口,所以...?
还有什么我可以做的吗?
(包含强制类型转换的代码被包含BSpecific
类的项目用作参考,但是它本身不知道BSpecific
是什么,因此强制类型转换。)>
答案 0 :(得分:1)
BSpecific
继承自BBase<A>
,而不是BBase<IA>
。
让BSpecific
继承自BBase<IA>
或将BSpecific
强制转换为IB<A>
,您的代码就会编译。