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

cae*_*say 3 c# generics inheritance

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

public class RandomClass<TK, TV>
{
    internal class RandomClassWrapper<TK, TV> : RandomClass<TK, TV> {}
}
Run Code Online (Sandbox Code Playgroud)

现在的原因是,RandomClassWrapper使用new关键字来覆盖RandomClass中某些方法的行为.这是因为我只希望我的库能够访问这些功能.

它还需要修改RandomClass中的一些私有变量,这就是它嵌套的原因.

但是,当我想初始化时,我必须去

var rc = new RandomClass<int, int>.RandomClassWrapper<int, int>();
Run Code Online (Sandbox Code Playgroud)

为什么首先<int, int>需要?为什么不能这样写:

var rc = new RandomClass.RandomClassWrapper<int, int>();
Run Code Online (Sandbox Code Playgroud)

有什么方法我可以避免必须输入额外的<int, int>东西,可以变成这样的东西:<Dictionary<string, nameofclass>, List<thisistoolong>>

这有点夸张,但你理解我的意思.不得不将这些类型放两次是对空间的巨大浪费.

有谁能提出不同的方法?

由于这有助于澄清这个问题,我会关注这两条评论:

那么,你的问题是"为什么编译器不能从RandomClass的参数推断出RandomClassWrapper的泛型参数? - Ed S. 3分钟前

@EdS.这是问题的一个组成部分,是的.另一个是:既然它不能,是否有一个替代方法/ hack可以清理它并避免必须两次输入泛型参数. - 刚才caesay

Jas*_*rke 5

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

internal class RandomClassWrapper : RandomClass<TK, TV> {}
Run Code Online (Sandbox Code Playgroud)

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

var rc = new RandomClass<int, int>.RandomClassWrapper();
Run Code Online (Sandbox Code Playgroud)

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

RandomClass<int, int>已经是一个不同的定义RandomClass<string, string>,因此它的内部嵌套类也已经包含在一个单独的通用定义中.