2010-08-24 220 views
2

這是一個相當初級的C#問題;我的道歉,但我一直無法在其他地方找到。C#類型轉換爲泛型參數

什麼是從Object<class>轉換爲Object<interface>的最佳方法?

I.e.

//fake interface 
interface ignu {} 

//fake class which implements fake interface 
class bee : ignu {} 

//function which accepts a generic with the interface 
function bang(template<bee>) {} 

//template type but with a class that implements the interface 
template<bar> foo; 

//trying to call the function, but compiler complains it can't implicitly convert 
bang(foo); 

//compilers complains that it cannot convert from template<bee> to template<ignu> 
bang((template<ignu>)bee) 

也許我是遠離基地,但這似乎應該工作和可行,但解決方案是逃避我。

編輯:mygen更改爲模板,我用兩指這是混淆

編輯同樣的事情:我結束了使用強制類似於: 邦(bee.Cast());

+0

'mygen'應該是'template'嗎? – recursive 2010-08-24 18:04:21

+0

我對bang的簽名感到困惑,你是否試圖說它接受一個任意的類? – MerickOWA 2010-08-24 18:10:57

回答

1

.NET 3.5在泛型中沒有協變和協變性,如MonkeyWrench所示。但是,建立必要的鑄造方法。

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<ccc> c = new List<ccc>(); 
     c.Add(new ccc()); 

     List<iii> i = new List<iii>(c.Cast<iii>()); 
    } 
} 

interface iii 
{ 
    void DoIt(); 
} 

class ccc : iii 
{ 
    public void DoIt() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

我基本實現了chilltemp演示的功能。我讚賞Andorbal的建議和遞歸的第一個答案,他的評論說Cast將會避免使用lambda。 – William 2010-08-24 19:15:48

2

沒有保證Generic<SubType>實際上可以作爲Generic<BaseType>的替代品。

考慮一下:

List<int> intlist = new List<int>(); 
List<object> objlist = intlist; // compile error 
objlist.Add("foo"); // what should be in intlist now? 

你在找什麼叫合作和禁忌變異。他們已被添加到C#4中。

+0

您正在發送雙重訊息。你給的例子(與問題類似)在4.0中也不起作用。它不應該。 – 2010-08-24 18:13:28

+0

+1,爲什麼在泛型類型上沒有自動協方差的很好的解釋。 – Heinzi 2010-08-24 18:15:13

+0

您已經強調了面向對象編程中的繼承問題;當涉及到接口時,這真的是一個有效的參數嗎?接口的要點不是標準化您可能在同級類之間採取的某些操作?說我想在一個這樣的類的集合而不是一個實例上做它真的不合理嗎?這些都是誠實的問題,我從下面的答案中看到,我可以解決它,所以我正在尋找一些我應該注意的事項以及我應該注意的警告。 – William 2010-08-24 19:11:01

0

在.NET 3.5中,我會處理這樣的事情在類似下面的列表:

list<bar> myList = new list<bar>; 
myList.Select<ignu>(x => x).ToList(); 

我認爲這將不會太難爲單個對象做這樣的事情。

+0

如果使用.Cast而不是Select,則不需要傳遞一個lambda。 – recursive 2010-08-24 18:10:35

+0

這甚至更好! – Andorbal 2010-08-24 18:27:12