2013-07-02 13 views
0

投我有這樣的類:無法從基礎的XElement類

Public Class MyXElement 
    Inherits XElement 

    Public Sub New(other As XElement) 
     MyBase.New(other) 
    End Sub 

    Public Sub New(name As XName) 
     MyBase.New(name) 
    End Sub 

    Public Sub New(other As XStreamingElement) 
     MyBase.New(other) 
    End Sub 

    Public Sub New(name As XName, content As Object) 
     MyBase.New(name, content) 
    End Sub 

    Public Sub New(name As XName, ParamArray content() As Object) 
     MyBase.New(name, content) 
    End Sub 

End Class 

爲什麼下面的代碼會失敗?

Dim x1 As XElement = <demo></demo> 
Dim x2 As MyXElement 
x2 = x1 

我得到異常:無法轉換類型「System.Xml.Linq.XElement」的對象鍵入「MyXElement」。

+0

你沒有的隱式轉換操作符:http://stackoverflow.com/questions/1312549/is-there-a-way -to-define-an-implicit-conversion-operator-in-vb-net –

+0

是的,但僅僅是因爲它不允許爲繼承類型定義轉換運算符。通常從基類到繼承的轉換不是問題,但在這種情況下不是問題:/ – Dima

+0

*「是的,但僅限於不允許爲繼承類型定義轉換運算符」*。事實上,你是對的。 –

回答

2

很簡單 - x1不是MyXElement對象!這是一樣的嘗試以下操作:

Dim o1 as Object = new Object() 
Dim o2 as String 
o2 = o1 

事實上,String繼承Object並不意味着你可以Object變量分配給String

它的工作原理其他方式。您可以輕鬆地編寫以下內容:

Dim x1 As MyXElement = new MyXElement("name") 
Dim x2 As XElement 
x2 = x1 
+0

因爲對我提出這樣一個愚蠢的問題感到羞恥:))))還有對你的獎勵,Marcin。 – Dima

0

Marcin解釋了它爲什麼不起作用。我的答案顯示你需要做的仍然轉換XElementMyXElement

您需要使用您的MyXElement定義構造函數:

Dim x2 = new MyXElement(x1)