所以我有一个内部带有包装器类的类,如下所示:
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刚才
最佳答案
第二个类嵌套在外部泛型类中,因此不需要重新指定类型。
internal class RandomClassWrapper : RandomClass<TK, TV> {}
应该正确编译,然后您只需指定一组泛型,因为嵌套类会自动共享类型:
var rc = new RandomClass<int, int>.RandomClassWrapper();
您需要了解的是,在幕后,编译器会为每种不同的泛型类型集生成新的类定义(我认为措辞很差)。这意味着
RandomClass<int, int>
已经是与RandomClass<string, string>
不同的定义,因此其内部嵌套类也已经包含在单独的泛型定义中。