Здравствуйте, Sinclair, Вы писали:
S>Всё равно всё упирается в возможность вызывать встроенные операторы без полиморфизма.
Q>>Произойдёт мономорфизация, исчезнут callvirt'ы, в простых случаях даже инлайнинг будет. Это ж не делегаты с гарантированной косвенностью. Мы ж передаём не IMonoid<T>, а TMonoid where TMonoid : IMonoid<T>.
S>Ну, если так-то конечно почему бы и нет.
S>Можно проверить, получится ли это сделать сейчас — если передать struct Monoid как параметр шаблона, то по идее это должно вызвать принудительную специализацию, и все абстрактные методы будут проинлайнены.
Так он уже параметр шаблона. Проверить можно — я
подрубил к бенчмарку DisassemblyDiagnoser. (Сам-то я не шарю в CIL; но на вид генерируемый код такой же.)
S>Да и Zero-то описывать надо только для разве что string, потому что нулями всех остальных совершенно случайно являются default(T).
Кроме, например, мультипликативных моноидов, где нейтральным элементом будет единица.