Возможны ли ограничения общего члена F # в C #? - PullRequest
7 голосов
/ 22 марта 2019

F # позволяет ограничивать универсальные типы для членов типа, например:

    type ClassWithMemberConstraint<'T when 'T : (static member StaticProperty : unit)> =
    class end

Это может быть очень удобно, особенно потому, что CLR не позволяет определять интерфейсы со статическими членами.Поскольку F # допускает такое ограничение, я предполагаю, что это означает, что CLR также допускает ограничения общего элемента, но из того, что я могу сказать, это невозможно в C #.

Есть ли способывыразить это поведение в C #?

Ответы [ 2 ]

3 голосов
/ 24 марта 2019

Поскольку F # допускает такое ограничение, я предполагаю, что это означает, что CLR также допускает ограничения общего элемента

К сожалению, нет. Ограничения члена F # реализованы "вне IL", так сказать. Функции с ограничениями на элементы не компилируются в методы IL, а хранятся в метаданных F # в сборке. Затем каждый раз, когда вызывается такая функция, ее код вставляется на сайт вызова с универсальным типом, специализированным для того, что используется в этом конкретном месте. Поэтому, кстати, все функции с ограничениями на членов должны быть помечены inline.

2 голосов
/ 22 марта 2019

Что ж, сравнивая ограничения F # с C # единицами , мы видим, что не существует эквивалента F # Явное ограничение члена в C #.

Что вы можете сделать, это определить абстрактный класс и ограничить его, поэтому ваши классы должны наследовать от этого абстрактного класса. Однако обратите внимание, что унаследованные классы будут использовать тот же статический объект родительского абстрактного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...