Как определить предел универсального типа для примитивных типов? - PullRequest
57 голосов
/ 30 апреля 2009

У меня есть следующий метод с универсальным типом:

T GetValue<T>();

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

C GetObject<C>() where C: class;

Я не уверен, возможно ли это для примитивных типов и как, если так.

Ответы [ 5 ]

44 голосов
/ 30 апреля 2009

Вы можете использовать это, чтобы ограничить его типами значений:

where C: struct

Вы также упоминаете строку. К сожалению, строки не будут разрешены, так как они не являются типами значений.

17 голосов
/ 03 декабря 2013

На самом деле это делает работу в определенной степени:

public T Object<T>() where T :
   struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>

Чтобы ограничиться числовыми типами, вы можете получить некоторые полезные советы из следующих примеров, определенных для ValueType class

13 голосов
/ 30 апреля 2009

Вот что вы ищете:

T GetObject<T>() where T : struct;
10 голосов
/ 30 апреля 2009

Не существует общего ограничения, которое бы точно соответствовало этому набору вещей. Что вы на самом деле хотите сделать? Например, вы можете обойти это с помощью проверок во время выполнения, таких как статический ctor (для универсальных типов - не так просто для универсальных методов) ...

Тем не менее, чаще всего я вижу это, потому что люди хотят одного из:

  • чтобы иметь возможность проверять элементы на равенство: в этом случае используйте EqualityComparer<T>.Default
  • для возможности сравнения / сортировки элементов: в этом случае используйте Comparer<T>.Default
  • для выполнения арифметики: в этом случае используйте поддержку MiscUtil для универсальных операторов
6 голосов
/ 30 апреля 2009

Что вы на самом деле пытаетесь сделать в методе? Возможно, вам нужен C для реализации IComparable или какого-то другого интерфейса. В этом случае вы хотите что-то вроде

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