2011-05-12 115 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() { } 
}