Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

Почему нельзя использовать пользовательские преобразования в данных случаях?

05.01.2019, 12:03. Просмотров 1725. Ответов 5
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
class First
{
    public static implicit operator Second(First x) => new Second();
}
 
class Second : First
{
    public static implicit operator First(Second x) => new First();
}
Почему следующие ошибки компиляции:
1) Ошибка CS0553 'Second.implicit operator First(Second)": не разрешено пользовательское преобразование в базовый класс или из базового класса.
2) Ошибка CS0554 'First.implicit operator Second(First)": не разрешено пользовательское преобразование в производный класс или из производного класса.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2019, 12:03
Ответы с готовыми решениями:

Почему break нельзя использовать в if?
почему break нельзя использовать в if вот код if(f.eof()==1) { break; } про break MVS...

Почему нельзя использовать глобальные переменные
Здравствуйте, собственно вышел сиз данным вопросом в гугл и на стаке нашел такой ответ:...

Почему структуру нельзя использовать в классе?
#include <iostream> class editor_form { struct prop { int y; }; prop...

Почему нельзя использовать метод ReadAllLines?
static int FoundConst(string fileAddress, string cs) { ...

5
Эксперт .NET
14707 / 11117 / 2920
Регистрация: 17.09.2011
Сообщений: 18,654
05.01.2019, 12:12 2
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Почему следующие ошибки компиляции
Потому что правилами языка запрещено переопределять полиморфические преобразования (от родителя к наследнику и наоборот).
Правилами языка должна гарантироваться неизменность экземпляра при полиморфических преобразованиях, а в вашем примере это уже нарушается, т.к. создаются новые экземпляры.
2
Модератор
8684 / 6007 / 1704
Регистрация: 21.04.2018
Сообщений: 17,893
Записей в блоге: 2
05.01.2019, 13:24 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Потому что правилами языка запрещено переопределять полиморфические преобразования (от родителя к наследнику и наоборот).
Правилами языка должна гарантироваться неизменность экземпляра при полиморфических преобразованиях, а в вашем примере это уже нарушается, т.к. создаются новые экземпляры.
А как правильно это сделать?
Переопределение преобразования из наследника в базовый как я понимаю, вообще, не нужно.
А из базового в наследника?
0
Эксперт .NET
14707 / 11117 / 2920
Регистрация: 17.09.2011
Сообщений: 18,654
05.01.2019, 13:34 4
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А как правильно это сделать?
В производном классе можно объявить метод, который вернет ссылку на экземпляр базового класса.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
А из базового в наследника?
В производном классе можно объявить конструктор, принимающий ссылку на базовый класс.

Только не очень понятна цель подобных преобразований, если наследование само по себе определяет отношение "является".
Зачем возвращать ссылку на базовый экземпляр, если производный экземпляр уже является базовым?

Добавлено через 3 минуты
Соколиный глаз, вы бы не торопились первый же ответ отмечать лучшим — подождите хотя бы день-два, а то многие знающие товарищи, увидев галочку, могут даже не зайти в тему и не подскажут/не дополнят/не исправят.
В результате вы можете получить ответ, который на самом деле и не ответ.
1
Модератор
8684 / 6007 / 1704
Регистрация: 21.04.2018
Сообщений: 17,893
Записей в блоге: 2
05.01.2019, 14:01 5
Цитата Сообщение от kolorotur Посмотреть сообщение
В производном классе можно объявить конструктор, принимающий ссылку на базовый класс.
Только не очень понятна цель подобных преобразований, если наследование само по себе определяет отношение "является".
Зачем возвращать ссылку на базовый экземпляр, если производный экземпляр уже является базовым?
Не знаю...
Вопрос появился после прочтения этой темы. О практической необходимости не задумывался.

Допустим есть экземпляр First, на его основе надо сделать экземпляр Second, но связь с начальным First не должна быть потеряна. Типа:
C#
1
2
First first = new First();
Second second = (Second) first;
То есть изменяя состояние first, должно меняться и состояние second. Но при этом у second есть и отличные от first свойства, методы. Аналогично как при обратном преобразовании от наследника к базовому типу.
Зачем это может понадобиться - не знаю. На данный момент интерес чисто академический.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
05.01.2019, 14:40  [ТС] 6
kolorotur, ну, я на свой вопрос ответ от Вас уже получил. Ответ меня вполне устраивает: кратко и понятно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2019, 14:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Почему в GUI нельзя использовать объект в main?
Делаю в конструкторе NetBeans, и проблема в том, что я не знаю, как использовать методы, ибо, ...

Почему нельзя в функциях использовать типизированные указатели ?
Почему нельзя в функциях использовать типизированные указатели ? Напр почему так нельзя ? {$R...

Почему в сокращённой записи if нельзя использовать return
Здравствуйте. Решил воспользоваться сокращённой записью if. Например: int temp() { int a; ...

Почему нельзя использовать более одной TServerSocket?
Пробовал использовать в программе две компоненты TserverSocket и не получилось. Выдает ошибку:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.