Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Почему при наследовании от дженериков не наследуются ограничения?

#c_sharp #net


Почему при наследовании от дженериков не наследуются все ограничения и в итоге приходится
тянуть портянку ограничений при наследовании.

В этом есть какой-то сакральный смысл по которому майрософт не стала давать эту возможность?
Вроде, не продублировав ограничений компилятор будет ругаться => нету возможности на
уровнях выше ставить альтернативные ограничения.

class Generic1 where T : class { }
class Generic2 : Generic1 where T : class { }

    


Ответы

Ответ 1



Сакральный смысл в том, что C# - язык с прямым порядком вывода типов, а не обратным. К примеру, в выражении double x = 1 / 2 под оператором / понимается целочисленное деление, а не вещественное - потому что операторы целочисленные. Язык не умеет выводить тип операндов исходя из предполагаемого типа результата. Также и для типов. Ограничения на параметры-типы - это их типы. Базовый класс - вычисляемое выражение. Тип вычисляемого выражения определяется исходя из типов операндов, а наоборот нельзя. Вы просто привыкли к простейшим формам наследования - Foo : Bar. Но ведь можно написать и так: Foo : Bar.C>. Какие ограничения откуда должны наследоваться в подобных случаях? По-идее, надо унаследовать ограничения класса Baz. Но это будет уже обратный вывод типа.

Комментариев нет:

Отправить комментарий