InvalidCastException,可能涉及泛型

时间:2019-05-22 09:29:39

标签: c# generics casting

我有以下课程:

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是什么,因此强制类型转换。)

1 个答案:

答案 0 :(得分:1)

BSpecific继承自BBase<A>,而不是BBase<IA>

BSpecific继承自BBase<IA>或将BSpecific强制转换为IB<A>,您的代码就会编译。