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

时间:2011-05-12 15:13:23

标签: c# java .net 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>{
    ....
}

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

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());
}

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:8)

没有

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

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

编辑:在您的具体情况下,最佳解决方案是让IMyInterface<T>继承一个单独的非通用IMyInterface界面,并移动所有不涉及T的成员{1}}到基接口 然后,您可以使用Dictionary<string, IMyInterface>,这样就不会有任何问题。

答案 1 :(得分:2)

可以将类型变量限制为某些类型:

public class Map<U, T> where T : IInterface
{
}

但是,您无法执行以下操作:

Map<string, T> map = new Map<string, T>()

答案 2 :(得分:2)

对于您所描述的用法,您可以使用IDictionary<string, ISomeInterface>的解决方法:

interface ISomeInterface
{
    object Method();
    void Method2();
}

interface ISomeInterface<T> : ISomeInterface
{
    T Method();
}

class C1 : ISomeInterface<int>
{
    object ISomeInterface.Method() { return Method(); }
    public int Method() { return 10; }
    public void Method2() { }
}