Size: a a a

2020 March 20

AT

Alexey Tkachenko in pro.net
источник

AH

Ayrat Hudaygulov in pro.net
источник

AT

Alexey Tkachenko in pro.net
If x has type X and y has type Y then

   If an implicit conversion (Implicit conversions) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
   If an implicit conversion (Implicit conversions) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
   Otherwise, no expression type can be determined, and a compile-time error occurs.
источник

IC

Ilya Chernoudov in pro.net
Alexey Tkachenko
If x has type X and y has type Y then

   If an implicit conversion (Implicit conversions) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
   If an implicit conversion (Implicit conversions) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
   Otherwise, no expression type can be determined, and a compile-time error occurs.
👍
источник

AH

Ayrat Hudaygulov in pro.net
Alexey Tkachenko
If x has type X and y has type Y then

   If an implicit conversion (Implicit conversions) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
   If an implicit conversion (Implicit conversions) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
   Otherwise, no expression type can be determined, and a compile-time error occurs.
нихуя себе, нашлося.
источник

AT

Alexey Tkachenko in pro.net
более того, если есть два типа с implicit cast друг в друга, то их использовать низзя
источник

IC

Ilya Chernoudov in pro.net
Alexey Tkachenko
более того, если есть два типа с implicit cast друг в друга, то их использовать низзя
ну хоть кто то меня понимает
источник

AT

Alexey Tkachenko in pro.net
там есть ещё одна прикольная фишка
источник

AT

Alexey Tkachenko in pro.net
int a = test() ? 1 : throw new ArgumentException();

bool test()
{
   return false;
}

так тоже можно
источник

AH

Ayrat Hudaygulov in pro.net
короче, тут недоработка. Ясно что компилятор пытается вывести тип выражения только по внутренностям экспрешна.
Но есть тонна примеров когда рослин может применять внешние констрейны для вывода типов (например учитывать возвращаемый тип)
Или когда мы присваиваем в перемнную другого типа, рослин может сделать имплисит каст

Даже вот такое не скомпилится

object a = true? “” : new List<int>();
источник

AH

Ayrat Hudaygulov in pro.net
то есть тут все ограничения есть, рослин умеет это делать
источник

AH

Ayrat Hudaygulov in pro.net
Но здесь - не делает
источник

AH

Ayrat Hudaygulov in pro.net
поэтому рослин тупой
источник

AH

Ayrat Hudaygulov in pro.net
Не потому что это по спеке
источник

AH

Ayrat Hudaygulov in pro.net
по спеке ебаный рослин умеет делать так

object a = SomeExpressionOfTypeString()
источник

AH

Ayrat Hudaygulov in pro.net
или атк

Animal Foo() {
  return Cat()
}
источник

AT

Alexey Tkachenko in pro.net
зато это поведение не ломает рефакторинги, при которых внезапно может появиться неоднозначность или информация для вывода потеряется
источник

AH

Ayrat Hudaygulov in pro.net
и нихуя себе, тайпчеки проходят
источник

AH

Ayrat Hudaygulov in pro.net
наверное потому что рослин таки знает о констрейнах метода в строчке return
источник

AH

Ayrat Hudaygulov in pro.net
Короче, рослин умеет налагать констрейны на экспрешн и имплист каст для него это bread & butter

Но тут внезапно НЕТ
источник