2011-05-12 114 views
10

在Java中,我可以使用通配符“?”指定泛型。有可能创建一个这样的地图:关于C#中与泛型相比的泛型问题

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>{ 
    .... 
} 

我试图映射此对象插入字典等:实现ISomeInterface使用装配在运行时被加载

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

对象和Activator.createInstance。在创建时,如果对象实现ISomeInterface<int>ISomeInterface<double>,则不会。

任何帮助,非常感谢。

+1

您想做什么? – SLaks 2011-05-12 15:20:32

+2

我不知道Java那么多,但是不会''和'Object'一样吗? – 2011-05-12 15:22:34

+1

是的,'?'是'Object'。更令人意想不到的是,你写的任何东西实际上都是Object,因为Java的虚拟机实际上并不支持泛型,所以它们在编译时都会被擦除。 – Blindy 2011-05-12 15:24:08

回答

8

但是,如果你使用C#4,你可以ISomeInterfacecovariant使ISomeInterface<Anything>将可转换为ISomeInterface<object>

如果ISomeInterface有需要的类型参数的参数(而不是返回值)的方法,这将是完全不可能的,因为它会再允许你传递任意对象作为参数。

编辑:在您的特定情况下,最好的解决办法是让IMyInterface<T>继承的独立非通用IMyInterface界面和移动不涉及T在底座接口的所有成员。
然后你可以使用Dictionary<string, IMyInterface>,你不会有任何麻烦。

2

有限制你的类型变量的某些类型的可能性:

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

但是,你不能这样做:

Map<string, T> map = new Map<string, T>() 
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() { } 
}