假设我们有一个嵌套的泛型类:
public class A<T> {
public class B<U> { }
}
在这里,typeof(A<int>.B<>)
本质上是一个具有两个参数的泛型类,其中只有第一个被绑定。
如果我有一个包含两个参数的单词
public class AB<T, U> { }
有没有办法引用“AB
T=int
和U
保持开放”?如果不是,这是C#限制还是CLR限制?
答案 0 :(得分:10)
显然无法在C#中完成,你必须同时指定两个类型参数,或者不指定。
CLR似乎也不支持它,A<int>.B<>
和A<string>.B<>
引用相同的类型:
Type t1 = typeof(A<int>).GetNestedType("B`1");
Type t2 = typeof(A<string>).GetNestedType("B`1");
// t1.Equals(t2) is true
两种类型的封闭类型是A<>
(开放泛型类型)
编辑:进一步测试显示typeof(A<int>.B<string>)
实际上是一个通用类型的arity 2,不是嵌套泛型类型的arity 1 ... typeof(A<int>.B<string>).GetGenericArguments()
返回一个数组typeof(int)
和 typeof(string)
。所以typeof(A<int>.B<>)
实际上等同于(A.B)<int, >
,不支持(通用类型不能部分关闭)
答案 1 :(得分:3)
这是你的想法吗?
class AB<T, U>
{
protected T t;
U u;
}
class C<U> : AB<int, U>
{
public void Foo()
{
t = 5;
}
}