Цитата:
Сообщение от
mazzy
гуглить в сторону "ковариантность" и "инвариантность".
Гуглим:
Ковариа́нтность и контравариа́нтность[1] в программировании — способы переноса наследования типов на производные[2] от них типы — контейнеры, обобщённые типы, делегаты и т. п. Термины произошли от аналогичных понятий теории категорий «ковариантный» и «контравариантный функтор».
Цитата:
Сообщение от
mazzy
в java изначально типы ковариантны. и дополнительно было очень много послаблений в примитивных типах.
Это вообще про что? В джаве изначально не было дженериков как и в X++ и в С# какие именно типы были ковариантны?
Цитата:
Сообщение от
mazzy
в аксапте изначально добавили ковариантность в методы классов. что позволяло до ax2009 указывать производные типы методах классов наследников (уж не знаю по недосмотру или был какой замысел).
Это я тоже не понял. При чем тут ковариантность? Имеется ввиду
covariant return types?
Вот хочется проверить. У кого под руками есть 2012, можете проверить, что поддерживается именно ковариантность а не произвольное переопределение. Т.е. что контроллируется что метод производного класса обязан возвращать именно подкласс результата переопределенного метода, а не вообще все, что угодно, лишь бы оно было классом (назовем это пофиг-вариантностью)
Цитата:
в ax2012 с какого-то перепуга разработчики сделали типы инвариантными как в C# 2.0. причем очень жестко.
из-за этого нельзя уточнять тип в параметрах методов и в возвращаемых значениях.
Перепуг назывался "компиляция в IL", для того, чтобы статические проверки компилятора гарантировали в большем количестве случаев работу в IL.
X++ изначально это статически типизированный язык натянутый на не очень строго типизированный рантайм.
MyClass x = otherValue;
x.myMethod(a);
Будет работать всегда, когда у otherValue есть метод совпадающий по имени и имеющий один обязательный параметр. Не важно, otherValue наследуется от MyClass или нет.
JFYI, Параметры методов, наоборот, должны быть контровариантными см. LSP.
Цитата:
были слухи, что в ax2012 делали перегрузку методов и генерики.
но ни перегрузки, ни генериков в аксапту так и не завезли.
Перегрузку завезли только со стороны использования (можно вызвать дотнетовский класс и вызов выберет правильную перегрузку). Не знаю в какой версии. В 365 точно есть. Дженерики официально не поддерживаются но какие-то варианты компилируются.
На уровне IL опциональные параметры компилируются в перегрузки.
Цитата:
в d365fo, насколько я помню, типы снова стали ковариантными.
после того, как в C# 4.0+ добавили ковариантность для генериков
Тут мне опять непонятно, что такое "типы ковариантные" если нет дженериков. Ковариантности возвращаемых значений функции нет.
Цитата:
сделано "как в c#" людьми, которые кроме c# ничего не знают.
Это же предположение же, ты ж не знаешь наверняка что знает человек который это делал?