C # универсальный с константой - PullRequest
20 голосов
/ 09 января 2011

Есть ли что-то похожее на этот шаблон C ++?

template <int A>
class B
{
    int f()
    {
        return A;
    }
}

Я хочу сделать каждый экземпляр B <1>, B <2> и т. Д. (Например, кортеж) другим типом.

Ответы [ 4 ]

21 голосов
/ 09 января 2011

Короткий ответ: нет .

Он не подходит для работы обобщений C #, в отличие от шаблонов C ++.

Обобщения .netэто не языковая функция, а функция времени выполнения.Среда выполнения знает, как создавать экземпляры обобщенных типов из специального универсального байт-кода, который довольно ограничен по сравнению с тем, что могут описывать шаблоны C ++.

Сравните это с шаблонами C ++, которые в основном создают экземпляр всего AST класса, используя замещенные типы.Можно было бы добавить инстанцирование на основе AST во время выполнения, но это, безусловно, было бы намного сложнее, чем текущие генерики.

Без таких функций, как массивы типов значений (которые существуют только в небезопасном коде),Рекурсивная реализация шаблона или специализация шаблона с использованием таких параметров также не будет очень полезной.

15 голосов
/ 21 сентября 2015

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

public interface ILiteralInteger
{
   int Literal { get; }
}

public class LiteralInt10 : ILiteralInteger
{
   public int Literal { get { return 10; } }
}

public class MyTemplateClass< L > where L: ILiteralInteger, new( )
{
   private static ILiteralInteger MaxRows = new L( );

   public void SomeFunc( )
   {
      // use the literal value as required
      if( MaxRows.Literal ) ...
   }
}

Использование:

var myObject = new MyTemplateClass< LiteralInt10 >( );
12 голосов
/ 09 января 2011

C # не поддерживает универсальные параметры не типичного типа, как в C ++.

Универсальные C # гораздо проще и менее функциональны, чем шаблоны C ++.MSDN имеет краткий список различий между шаблонами C ++ и C # Generics .

5 голосов
/ 09 января 2011

Обобщения C # специализируются во время выполнения, тогда как шаблоны C ++ обрабатываются во время компиляции для создания совершенно нового типа. Учитывая это, среда выполнения просто не имеет возможностей для обработки нетиповых параметров (это не просто проблема C #).

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