Что означает ограничение «структура»? - PullRequest
3 голосов
/ 06 октября 2011

Это ограничение 'struct' в универсальных классах или методах в C #. Я хочу знать, что это означает только структуры или любой тип, производный от типа значения, такого как int, double, enum, ant и так далее. Позволяет ли следующий код использовать простые типы?

class SomeGenericClass <T> where T : struct
{
 //some inplementation
}

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

Что означает ограничение "struct"?

Это означает любой необнуляемый тип значения. Все структуры являются типами значений.

Я хочу знать, что это означает только структуры или любой тип, производный от типа значения, такого как int, double, enum, ant и так далее. Позволяет ли следующий код использовать простые типы?

Ваши так называемые "простые типы", такие как int, double и enum, являются не чем иным, как ключевыми словами C #, которые соответствуют структурам System.Int32 и System.Double, и классом System.Enum, который основанный на System.ValueType (который делает перечисления также типами значений, несмотря на то, что Enum является самим классом).

Следовательно, эти типы также удовлетворяют ограничению where T : struct, наряду с регулярными структурами.

3 голосов
/ 06 октября 2011

Это означает, что T может быть только типом значения. Тип значения - это только те структуры данных, которые определены с ключевым словом struct и ключевым словом enum.

Например,

struct A{}; //value-type
struct B{}; //value-type
class C{};  //reference-type
enum D {};  //value-type

SomeGenericClass<A> a; //ok
SomeGenericClass<B> b; //ok
SomeGenericClass<C> c; //compilation error - C is not value type
SomeGenericClass<D> d; //ok

Что касается int, double, float и других встроенных типов, все они являются типами значений. Каждое из этих ключевых слов соответствует структуре, определенной в платформе. Например, int в основном System.Int32, а double - System.Double и т. Д.

0 голосов
/ 06 октября 2011

взято из спецификации языка C # глава 4.1.10:

И наоборот, тип значения, не допускающий значения NULL, является любым типом значения, кроме System.Nullable и его сокращения T?(для любого T), плюс любой параметр типа, который ограничен типом значения, который не может иметь значение NULL (то есть любой параметр типа с структурным ограничением ) .

так что да, это в основном означает, что T ограничен типами значений, а не ссылочными типами.

...