所以我有一个内部带有包装器类的类,如下所示:

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>不同的定义,因此其内部嵌套类也已经包含在单独的泛型定义中。

10-05 21:55