【发布时间】:2012-06-25 09:18:12
【问题描述】:
我在比较泛型类型时遇到了 is 运算符的问题。
public interface ISomeInterface<T> where T : SomeBaseClass{
}
public class SomeClass : SomeBaseClass{
}
现在我们想用 is 运算符检查类型。我们有一个实现接口 ISomeInterface 的类的实例。
不幸的是,我们面临以下问题:
// someObject is an Instance of a class implementing interface ISomeInterface<SomeClass>
bool isSomeBaseClass = someObject is ISomeInterface<SomeBaseClass>; // false
bool isSomeClass = someObject is ISomeInterface<SomeClass>; // true
是否可以检查变量泛型类型?
提前致谢, 托比
【问题讨论】:
-
请稍微清理一下你的 C&P - 你的两个测试都是一样的。
someObject的声明也很好。 -
运算符返回
false的原因是因为ISomeInterface<SomeClass>不是ISomeInterface<SomeBaseClass>的子类型。很容易想象一个例子,将第一个向上转换到第二个会导致类型安全错误。 (例如,将IList<string>转换为IList<object>,然后向其添加一个整数。) -
@millimoose 这正是问题所在。但是,如果我想为 IList
is IList -
@Tobias Kek 的解决方案可能适用于此,但我不确定何时有用。如果接口在
T上不是协变的,则这两种类型之间没有任何有意义的关系。\