2012-05-02 66 views
3

我有繼承結構:Foo實現IGraphNode繼承IGraphItem爲什麼我要在這裏投兩倍?

FooIGraphItem/IGraphNode,以及用於IGraphItem/IGraphNode所有實施駐留在單獨的組件。我正在使用控制容器的反轉,所以我正在參與的項目中有前兩個參考(FooIGraphItem和),但不是執行IGraphItem/IGraphNode。我也有Option Strict on,因爲它是這個項目所需要的(如果關閉沒有解決問題,轉向)。我使用.NET 3.5。

我身邊路過一個IGraphItem,我有代碼看起來像這樣:

Public Sub ProcessItem(of IGraphItem)(item As IGraphItem) 
    If TypeOf item Is Foo Then 
     Dim f1 = CType(item, Foo) 'Compiler error 
     Dim f2 = DirectCast(item, Foo) 'Compiler error 

     'This is what I'm currently having to do. It works. 
     Dim f = CType(CType(item, IGraphNode), Foo) 

     'Do stuff 
    End If 
End Sub 

爲什麼我有這樣做的任何想法?我應該補充一點,TryCast的作品,但由於我們剛剛確認item的類型是Foo,我不明白爲什麼我不能DirectCast它。如果我錯了,它不應該讓我拋出異常嗎?有沒有更好的方法來完成我想要做的事情?

+0

不知道發生了什麼事情,但它編譯和作品也運行。你得到什麼編譯器錯誤? –

+0

@TimSchmelter:我得到'IGraphItem'類型的值不能轉換爲'Foo''錯誤。更新的問題添加,我正在使用.NET 3.5。 –

+0

當我將目標框架更改爲3.5時,我得到了許多例外。但仍然沒有問題的投入項目(這是ob類型'IGraphNode')鍵入'Foo'。 –

回答

2

即使在目標框架爲3.5時,您的原始代碼編譯時也沒有問題。

與您當前密碼的問題是,您已經定義了一個通用的方法,而IGraphItem不是它可以是任何類型的接口的類型,但是泛型類型T。但它不能是T以外的另一種類型,並且您試圖將其轉換爲Foo

如果你想你的方法的簽名更改爲別的它會工作,例如:

Public Sub ProcessItem(of IGraphItm)(item As IGraphItem) 

我認爲你有點「陰影」你的界面IGraphItem型與通用型IGraphItem在這種方法。

如果您明確告訴編譯器item As IGraphItem實際上是item As YourNamespace.IGraphItem,它也可以工作。

我敢肯定,喬恩或埃裏克能更好地解釋它,但也許是很有幫助反正;)