所以我有一个带有包装类的类,如下所示:
public class RandomClass<TK, TV>
{
internal class RandomClassWrapper<TK, TV> : RandomClass<TK, TV> {}
}
现在的原因是,RandomClassWrapper使用new
关键字来覆盖RandomClass中某些方法的行为。这是因为我只希望我的库能够访问这些功能。
它还需要修改RandomClass中的一些私有变量,这就是它嵌套的原因。
然而,当我想初始化时,我必须去
var rc = new RandomClass<int, int>.RandomClassWrapper<int, int>();
为什么需要首先<int, int>
?为什么不能这样写:
var rc = new RandomClass.RandomClassWrapper<int, int>();
有没有什么方法可以避免我必须输入额外的<int, int>
,这可能会变成:<Dictionary<string, nameofclass>, List<thisistoolong>>
这是夸大其词,但你理解我的意思。不得不将这些类型放两次是对空间的巨大浪费。
有人可以提出不同的方法吗?
由于这有助于澄清这个问题,我会关注这两条评论:
那么,你的问题是“为什么编译器不能从RandomClass的参数推断出RandomClassWrapper的泛型参数? - Ed S. 3分钟前
@EdS。这是问题的一个组成部分,是的。另一个是:既然它不能,是否有一个替代方法/ hack可以清理它并避免必须两次输入泛型参数。 - 刚才caesay
答案 0 :(得分:5)
第二个类嵌套在外部泛型类中,因此不需要类型重新指定。
internal class RandomClassWrapper : RandomClass<TK, TV> {}
如果编译正确,那么你只需要指定一组泛型,因为嵌套类会自动共享类型:
var rc = new RandomClass<int, int>.RandomClassWrapper();
你需要意识到的是,在引擎盖下,编译器会为每组不同的泛型类型生成新的类定义(我认为这些措辞很差)。这意味着
RandomClass<int, int>
已经与RandomClass<string, string>
的定义不同,因此其内部嵌套类也已包含在单独的通用定义中。