Общее ограничение .Net для типов структур - PullRequest
1 голос
/ 07 октября 2011

Я пытаюсь создать универсальный класс, реализация которого зависит от типа Int32, Int64, double, float или decimal.

class Calculator<T> where T: int, double, float, decimal

Это неправильно, но у меня проблемы с синтаксисом

Ответы [ 3 ]

8 голосов
/ 08 октября 2011

Я пытаюсь создать универсальный класс, реализация которого зависит от типа Int32, Int64, double, float или decimal.

Тогда это не универсальный.Универсальный тип - это тот, который работает одинаково для всех возможных аргументов типа, таких как универсальная очередь или универсальный словарь.

Классы «Калькулятора» являются наиболее распространенным сценарием для данной функции;мы получаем этот запрос все время.Мы гипотетически рассматриваем это для гипотетической будущей версии C #, которая не была анонсирована и не существует.Правильное выполнение функции потребовало бы значительной поддержки от гипотетической будущей версии CLR, которая также не была анонсирована и не существует.Сценарий не имеет особо высокого приоритета, так как эти вещи идут, поэтому, пожалуйста, не разочаровывайтесь, если это не сбудется.Например, мы можем сказать, что вы можете поместить статические методы в интерфейсы.Математические операторы являются статическими методами, и поэтому вы можете ограничить параметр типа типом, который реализует статический интерфейс IAddable, или что-то подобное.

Помните, что Эрик размышляет о будущем необъявленных продуктов, которые не существуют и могут никогда не существовать, только для вашего развлечения.

4 голосов
/ 07 октября 2011

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

Для этих конкретных типов вы можете указать:

where T : struct, IComparable, IFormattable, IConvertible,
          IComparable<T>, IEquatable<T>

Это, вероятно, ограничит набор довольно хорошо, хотя это также позволило бы другие примитивные типы, такие как byte и ulong.

4 голосов
/ 07 октября 2011

Вы не можете этого сделать.Вы можете сделать это только для интерфейса, class, struct, или пустого конструктора (new()) или базового класса.

См .: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

Ближайшийбыло бы struct, IConvertable.

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

class Calculator<T>  
   where T : struct
{
   static Calculator()
   {
     Debug.Assert(typeof(T) == typeof(int), "FAIL"); //TODO: extend to other types
   }
}
...