Общее ограничение: принудительно использовать для типа статическую функцию и конструктор с параметрами.

Я знаю, что вы можете написать:

class GenericClass<T> where T : new()
{ 

}

для обеспечения того, чтобы T имел пустой конструктор.

Мои вопросы:

  1. можете ли вы сделать так, чтобы T имел конструктор с определенным типом параметра? Нравится:

    class SingletonFactoryWithEmptyConstructor<T> where T : new(int)
    
  2. можете ли вы сделать так, чтобы T имел статическую функцию (скажем, void F()), чтобы вы могли использовать эту функцию внутри универсального класса? Нравится :

    class GenericClass<T> where T : void F()
    { 
       void G ()
       {
           T.F();
       }
    }
    

    Я знаю, что вы можете указать, что T реализует интерфейс, но я не хочу этого. Я хочу указать, что T имеет статическую функцию.


person geth    schedule 07.05.2011    source источник


Ответы (1)


Нет, в C # ничего подобного нет.

Ранее я предлагал " static interfaces " может выразить это достаточно четко. Они только были бы полезны для ограничений общего типа (во всяком случае, я подозреваю), но тогда вы могли бы выразить:

  • Конструкторы с произвольными параметрами
  • Статические методы и свойства
  • Операторы

На мой взгляд, последний из этих пунктов особенно интересен, поскольку позволяет использовать такие вещи, как общий метод «Среднее» по числовым типам с подходящими операторами сложения и деления.

Я считаю, что некоторые люди в MS думали о чем-то подобном, но я не слышал ничего, чтобы предположить, что они активно над этим работают.

person Jon Skeet    schedule 07.05.2011
comment
Я вздрагиваю всякий раз, когда думаю о кладжах, которые мне приходилось собирать, чтобы обойти это ограничение в прошлом ... (я много имею дело с дженериками). Как мне нужен статический интерфейс, хорошее решение проблемы. - person Mania; 07.05.2011
comment
По-видимому, это ограничение C #, а не CLR. Например, F # позволяет налагать явные ограничения членов, такие как наличие метода или свойства для типа ... - person Paul Michalik; 07.05.2011
comment
@Paul: Мне было бы интересно посмотреть, как это переводится на IL ... и включает ли он static членов? - person Jon Skeet; 07.05.2011
comment
@Jon Так бы я ... Сам еще не пробовал. Вращайте или вырезайте и вставляйте код (например, из codebetter .com / matthewpodwysocki / 2009/09/28 /, он очень часто цитирует вас) и взгляните на IL. И да, статические члены явно используются во всех примерах. Я предполагаю, что эти функции не выполняются каким-то хакерским взломом компилятора F #, похоже, что они действительно поддерживаются CLI. Интересно, что явные ограничения участников были помечены как не предназначенные для общего использования в MSDN до вчерашнего дня. Сегодня это ограничение снято. - person Paul Michalik; 08.05.2011
comment
@Paul, @Jon: Я не верю, что статические интерфейсы (явные ограничения членов, как они известны в F # - иначе говоря, утиная типизация) имеют какое-либо отношение к CLR. Это чисто особенность компилятора F #, что легко демонстрируется тем фактом, что функции, использующие такие ограничения, должны быть помечены inline. - person Daniel; 03.06.2011
comment
@Jon: Да, явные ограничения членов F # поддерживают статические члены (и операторы). - person Daniel; 03.06.2011
comment
После первого (немного более чем краткого) чтения Статически разрешенных параметров типа (F #) теперь я также считаю, что это особенность компилятора F # ... Однако нужно больше узнать об этом ... - person Paul Michalik; 04.06.2011
comment
Я попытался зафиксировать текущее состояние игры здесь: stackoverflow.com/a/18565782/746754 - person acarlon; 02.09.2013