Невозможно выполнить приведение из базового класса 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.


person Dima    schedule 02.07.2013    source источник
comment
У вас нет оператора неявного преобразования: stackoverflow.com/questions/1312549/   -  person Daniel Hilgarth    schedule 02.07.2013
comment
Да, но только потому, что нельзя определять оператор преобразования для унаследованного типа. Обычно преобразование из базового класса в унаследованный не является проблемой, но не в этом случае: /   -  person Dima    schedule 02.07.2013
comment
Да, но только потому, что нельзя определять оператор преобразования для унаследованного типа. Действительно, вы правы.   -  person Daniel Hilgarth    schedule 02.07.2013


Ответы (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
person MarcinJuraszek    schedule 02.07.2013
comment
Позор мне за такой глупый вопрос :)))) И тебе бонус, Марчин. - person Dima; 02.07.2013

Марчин объяснил, почему это не работает. Мой ответ показывает, что вам нужно сделать, чтобы преобразовать XElement в MyXElement.

Вам нужно использовать конструктор, который вы определили на MyXElement:

Dim x2 = new MyXElement(x1)
person Daniel Hilgarth    schedule 02.07.2013