由于泛型类型,不必要的长类名

时间:2012-06-25 04:34:33

标签: c# generics inheritance

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

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

1 个答案:

答案 0 :(得分:5)

第二个类嵌套在外部泛型类中,因此不需要类型重新指定。

internal class RandomClassWrapper : RandomClass<TK, TV> {}

如果编译正确,那么你只需要指定一组泛型,因为嵌套类会自动共享类型:

var rc = new RandomClass<int, int>.RandomClassWrapper();

你需要意识到的是,在引擎盖下,编译器会为每组不同的泛型类型生成新的类定义(我认为这些措辞很差)。这意味着

RandomClass<int, int>已经与RandomClass<string, string>的定义不同,因此其内部嵌套类也已包含在单独的通用定义中。