InvalidCastException

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

InvalidCastException

Сообщение Nord777 » 25.02.2005 (Пт) 20:39

:!: Не могу понять почему выкидывается исключение. Вроде все правильно.

Переопределяю класс TcpClient:

Код: Выделить всё
Public Class MyTcpClient
    Inherits TcpClient

    Public Shadows ReadOnly Property Active() As Boolean
        Get
            Return MyBase.Active
        End Get
    End Property

End Class



Где то в глубине кода...

Код: Выделить всё
Private TcpServer as TcpListener
Private tClient as TcpClient
Private Client As MyTcpClient

tClient = TcpServer.AcceptTcpClient

'приведение ссылки базового класса к типу производного класса
'Здесь и происходит исключение InvalidCastException
Client = CType(tClient, MyTcpClient)

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 25.02.2005 (Пт) 21:07

Так ведь вроде нельзя приводить объект родительского класса (TcpClient) к классу-потомку (MyTcpClient), можно только наоборот. Или я не прав?

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 25.02.2005 (Пт) 21:16

mad_Max писал(а):Так ведь вроде нельзя приводить объект родительского класса (TcpClient) к классу-потомку (MyTcpClient), можно только наоборот. Или я не прав?
Вроде как невсегда....Если приведение типов допустимо, то это возможно. Если нет, то vb генерирует исключение InvalidCastExeption, что мы и видим

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 26.02.2005 (Сб) 7:43

А в книге написано что можно, только после приведения типов я не смогу иметь доступ к переопределяемым методам (в моем случае это свойство Active)

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 26.02.2005 (Сб) 7:56

Кстати, присваивание объектов базового класса к ссылкам производного допускается только когда option strict включена

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 26.02.2005 (Сб) 23:54

Это я знаю. Уже голова раскалывается от ООП. Весь день читал про про отношения базовых и производных классов. Вот почитайте что пишут грамотеи:

Присваивание обьекта базового класса (или ссылки базового класса) ссылке производного класса (без приведения типов) является синтаксической ошибкой.


Если обьект производного был присвоен ссылке одного из его прямых или косвенных базовых классов, можно выполнять обратное преобразование этой ссылки базового класса в ссылку типа производного класса. В действительности это должно выполняться для пересылки сообщений этого обьекта, которые не появляются в базовом классе. (Замечание: мы иногда используем термин "сообщения" для предоставления вызова методов и свойств для обьекта)


Попытка приведения ссылки базового класса к типу производного класса приводит к генерации InvalidCastException, если ссылка ссылается на обьект базового класса, а не на обьект производного класса.


Кто нибудь понял что авторы хотели этим сказать и как этим воспользоваться? Вроде пишут по русски но я их не понимаю.


Тихо шифером шурша крыша едет неспеша :wink:


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 78

    TopList