Здравствуйте, vdimas, Вы писали:
V>Там все-равно уникальный код под структуру генерится джитом.
Генерится-то он джитом, но виртуальный вызов заменяется прямым ровно потому, что нельзя передать в метод Foo(ref T val) ссылку на потомка T.
А запрет на виртуальные методы в данном контексте плавно превращается в запрет реализовывать интерфейсы, чтобы избежать странных эффектов.
Ну, либо правила определения того, что можно, а что нельзя, становятся чрезмерно сложными.
V>Кстате, и тут АОТ может помочь, бо если две структуры имеют одинаковый лейаут и функциональность, то и сгенерённый код под них мог бы бы одинаковый.
Так-то и джит мог бы "увидеть", что две структуры имеют одинаковый лэйаут, то можно сравнить MSIL методов и для совпадающих методов генерировать одну копию кода.
V>Например, как все инстансы Pointer<T>.
Речь про велосипед типа
https://www.codeproject.com/Articles/1254502/Creating-a-pointer-type-in-Csharp?
Или есть какой-то кошерный Pointer<T>, на который можно посмотреть?
V>Именно.
V>Хотя, при передаче по-значению можно выкрутиться через implicit-оператор приведения типа.
Ну, это будет одновременно криво и неэффективно