关于C#中与泛型相比的问题

aum*_*ets 10 .net c# java generics covariance

在Java中,我可以使用通配符"?"指定泛型.可以像这样创建一个地图:

Map<String, ?>.

我正在使用C#,我需要一个Dictionary<String, SomeInterface<?>>(在哪里?可以是int,double,任何类型).这可能在C#中吗?

编辑:

例:

interface ISomeInterface<out T>{
 T Method();
 void methodII();
}

class ObjectI : ISomeInterface<int>{
    ...
}
class ObjectII : ISomeInterface<double>{
    ...
}
class ObjectIII : ISomeInterface<string>{
    ....
}
Run Code Online (Sandbox Code Playgroud)

我试图将这些对象映射到Dictionary中,如:

Dictionary<String, ISomeInterface<?>> _objs = new Dictionary<String, ISomeInterface<?>();

_objs.Add("Object1", new ObjectI());
_objs.Add("Object2", new ObjectII());
_objs.Add("Object3", new ObjectII());

foreach(var keyVal in _objs){
   Console.WriteLine(keyVal.Method());
}
Run Code Online (Sandbox Code Playgroud)

使用Assembly和Activator.createInstance在运行时加载实现ISomeInterface的对象.在创建的那一刻,我不会,如果对象实现 ISomeInterface<int>ISomeInterface<double>.

很感谢任何形式的帮助.

SLa*_*aks 8

没有.

但是,如果您使用的是C#4,则可以进行ISomeInterface 协变,以便ISomeInterface<Anything>可以转换为ISomeInterface<object>.

如果ISomeInterface有方法接受其类型参数的参数(而不是返回值),这将是完全不可能的,因为它将允许您传递任意对象作为参数.

编辑:在您的特定情况下,最好的解决方案是使IMyInterface<T>继承成为一个单独的非泛型IMyInterface接口,并将所有不涉及的成员移动T到基接口.
然后你可以使用a Dictionary<string, IMyInterface>而且你不会遇到任何麻烦.