C#相当于Java的通配符

如果存在,那么以下Java代码的C#等价物是什么:

new HashMap<Class, Integer>(); 

我目前使用new Dictionary() ,这更像
new HashMap<Class, Integer>()显然不一样。

(忽略HashMapDictionary之间的差异)

编辑:为了澄清,我不是要尝试定义一个新类,只需创建一个HashMap / Dictionary实例。

C#中没有Java通配符的等价物。 在Java中,类型的类型是Class ,其中T是类本身。 C#中的等价物是Type ,它不是通用的 。 所以你可以做的最好就是如你所说的那样使用Dictionary ,如果它被封装在一个类中,你可以限制你在代码中放入字典的内容(所以它只是运行时检查):

 private Dictionary myDictionary = new Dictionary(); public void Add(Type type, int number) { if (!typeof(BaseClass).IsAssignableFrom(type)) throw new Exception(); myDictionary.Add(type, number); } 

您甚至可以使用该逻辑实现自己的IDictionary

UPDATE

我能想到的另一个运行时技巧是为你的类型使用包装类:

 public class TypeWrapper { public Type Type { get; private set; } public TypeWrapper(Type t) { if (!typeof(T).IsAssignableFrom(t)) throw new Exception(); Type = t; } public static implicit operator TypeWrapper(Type t) { return new TypeWrapper(t); } } 

(还要实现EqualsGetHashCode ,只需委托给Type 。)

然后你的词典变成:

 var d = new Dictionary, int>(); d.Add(typeof(BaseClass), 2); d.Add(typeof(Child), 3); 

我相信你想要将类型参数约束为generics类型 – where关键字用于:

 class MyDict : Dictionary where TValue : SomeBaseClass { ... } 

这是你要求的还是我误解了你的问题?

编辑:您无法完全按照C#中的要求执行操作 – 您无法使用类型约束定义generics类型的本地实例。 但是,您可以预先声明受约束的Dictionary类型(如我的示例),然后创建该类型的实例,如下所示:

 // SomeClass will have to inherit from SomeBaseClass MyDict instance = new MyDict (); 

认为这与你正在寻找的很接近。 如果我误解它发表评论 – 我不深入了解Java。

正在调查同样的问题,这个可怜的男人的检查是我能想到的最好的事情:

 class MyValue { public Type Type { get; private set; } private MyValue(Type type) { this.Type = type; } public MyValue of() where T : BaseClass { return new MyValue(typeof(T)); } } IDictionary myDictionary = new Dictionary() { { 1, MyValue.of(); }, { 2, MyValue.of(); }, { 3, MyValue.of(); }, // this causes a compile error };