Подтвердить что ты не робот

С# общий с константой

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

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

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

4b9b3361

Ответ 1

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

Это не соответствует тому, как работают общие файлы С#, связанные с шаблонами С++.

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

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

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

Ответ 2

С# не поддерживает непиговые общие параметры, такие как С++.

Генерирование С# намного проще и менее способно, чем шаблоны С++. MSDN содержит краткий список Различия между шаблонами С++ и С# Generics.

Ответ 3

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

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 >( );

Ответ 4

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