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

Как определить общий предел типа для примитивных типов?

У меня есть следующий метод с общим типом:

T GetValue<T>();

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

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

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

4b9b3361

Ответ 1

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

where C: struct

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

Ответ 2

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

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

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

Ответ 3

который вы ищете:

T GetObject<T> where T: struct;

Ответ 4

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

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

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

Ответ 5

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

T GetObject<T> where T: IComparable