3

所以我有一个类,里面有一个包装类,如下所示:

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。这是问题的一个组成部分,是的。另一个是:由于它不能,是否有另一种方法/黑客可以清理它并避免必须输入两次通用参数。– 凯撒刚刚

4

1 回答 1

5

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

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

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

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

您需要意识到的是,在底层,编译器会为每组不同的泛型类型生成新的类定义(我认为措辞不好)。这意味着

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

于 2012-06-25T05:08:49.250 回答