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