Size: a a a

2020 March 21

Dv

Dr. Friedrich von Never in pro.net
Тут не требуется никакой вывод.
источник

Dv

Dr. Friedrich von Never in pro.net
(под локальным я тут имею в виду — вывод типов в пределах выражения)
источник

Dv

Dr. Friedrich von Never in pro.net
И, кажется, других примеров такого вывода, кроме тернарочки, у нас вообще и нету вовсе?
источник

AH

Ayrat Hudaygulov in pro.net
Dr. Friedrich von Never
Тут не требуется никакой вывод.
Пример неудачный так как все является обжектом

Animal Foo{

return Cat()
}

Animal Bar{
 return ""
}
источник

AH

Ayrat Hudaygulov in pro.net
Второе не скомпилится по тайп чеку.
источник

Dv

Dr. Friedrich von Never in pro.net
Мне больше добавить нечего.
источник

Dv

Dr. Friedrich von Never in pro.net
Пиши пропозал в спеку, делай референс имплементацию, na zdorovie.
источник

AH

Ayrat Hudaygulov in pro.net
Dr. Friedrich von Never
Пиши пропозал в спеку, делай референс имплементацию, na zdorovie.
👌
источник

Dv

Dr. Friedrich von Never in pro.net
На самом-то деле этот момент и правда бывает бесячим, особенно с nullable-типами. Будешь делать — заодно запили, чтоб работало int? x = cond ? 1 : null;
источник

NT

Nikita Tsukanov in pro.net
Dr. Friedrich von Never
Дело в том, что в общем случае у тебя может быть несколько одинаково общих типов в разных ветках тернарного оператора (например, общий базовый класс и общий базовый интерфейс). Поэтому компилятор действительно в общем случае не может этого угадать.
Может, но не хочет
источник

Dv

Dr. Friedrich von Never in pro.net
Nikita Tsukanov
Может, но не хочет
В общем случае не может.
источник

NT

Nikita Tsukanov in pro.net
Может
источник

Dv

Dr. Friedrich von Never in pro.net
Ну и как?
источник

Dv

Dr. Friedrich von Never in pro.net
void Foo() {
 var x = cond ? a : b;
}


Какой из общих супертипов a и b вот тут нужно вывести?
источник

Dv

Dr. Friedrich von Never in pro.net
Если у них есть три общих интерфейса и общий базовый класс.
источник

AH

Ayrat Hudaygulov in pro.net
Dr. Friedrich von Never
void Foo() {
 var x = cond ? a : b;
}


Какой из общих супертипов a и b вот тут нужно вывести?
Не, ну тут недостаточно констрейнов
источник

AH

Ayrat Hudaygulov in pro.net
а вот тут достаточно
Animal x = cond ? cat : dog;
источник

Dv

Dr. Friedrich von Never in pro.net
Ayrat Hudaygulov
Не, ну тут недостаточно констрейнов
Именно поэтому я говорю, что в общем случае задача в сегодняшнем языке не решается.
источник

Dv

Dr. Friedrich von Never in pro.net
Но её вполне можно решить в большинстве частных случаев.
источник

NT

Nikita Tsukanov in pro.net
Dr. Friedrich von Never
void Foo() {
 var x = cond ? a : b;
}


Какой из общих супертипов a и b вот тут нужно вывести?
Из использования x
источник