C# 中带有“as”和“is”的泛型有问题,“is”检查失败
本文关键字:is 泛型 失败 有问题 检查 as | 更新日期: 2023-09-27 18:37:07
我在使用 C# 泛型时遇到了麻烦:
MappingAdapter是 FullMappingAdapter 和 LiteMappingAdapter 继承自/实现的常见抽象基类。
创建泛型类会话的实例:
session = new Session<FullMappingAdapter>(
// ...
)
在会话中,决定我们是哪种会话:
// class declaration:
public class Session<T> : ISession
where T : MappingAdapter {
// ...
// method body:
T t = null;
if (t is FullMappingAdapter) {
// need parameter, cannot use where T : new() above
t = new FullMappingAdapter(someData) as T;
} else if (t is LiteMappingAdapter) {
t = new LiteMappingAdapter(someData) as T;
} else {
throw new NotSupportedException("Unknown Adapter specified, please fix.");
}
// ... more methods here ...
}
我总是被抛出NotSupportedException。此外,当在调试器中查看我的堆栈时,它在 t 的"类型"列中显示"FullMappingAdapter",这是正确的,也是我所期望的。但是为什么"is"关键字不能识别类型呢?
我做错了什么?
null
从来都不是任何东西。
您希望检查typeof(T)
是否为确切类型(或者可能是 IsAssignableFrom)。
完全匹配(与is FullMappingAdapter
不同,因为它不包括派生类型)
if(typeof(T) == typeof(FullMappingAdapter))
可分配 - 与is FullMappingAdapter
相同:
if (typeof(FullMappingAdapter).IsAssignableFrom(typeof(T))
您应该修改支票以使用 typeof
:
if (typeof(T) == typeof(FullMappingAdapter))
等等
你必须像这样检查
if (typeof(T) == typeof(FullMappingAdapter))