Что касается применения ограниченияnew, то следует обратить внимание на три других важных момента. Во-первых, его можно использовать вместе с другими ограничениями, но последним по порядку. Во-вторых, ограничениеnew позволяет конструировать объект, используя только конструктор без параметров, — даже если доступны другие конструкторы. Иными словами, передавать аргументы конструктору параметра типа не разрешается. И в-третьих, ограничениеnew нельзя использовать одновременно с ограничением типа значения, рассматриваемым далее.
Ограничения ссылочного типа и типа значения
Два других ограничения позволяют указать на то, что аргумент, обозначающий тип, должен быть либо ссылочного типа, либо типа значения. Эти ограничения оказываются полезными в тех случаях, когда для обобщенного кода важно провести различие между ссылочным типом и типом значения. Ниже приведена общая форма ограничения ссылочного типа.
where
В этой форме с операторомwhereключевое словоclassуказывает на то, что аргумент
Ниже приведена общая форма ограничения типа значения.
where
В этой форме ключевое словоstructуказывает на то, что аргументГдолжен быть типа значения. (Напомним, что структуры относятся к типам значений.) Следовательно, всякая попытка использовать ссылочный тип, напримерstring,вместоГприведет к ошибке во время компиляции. Но если имеются дополнительные ограничения, то в любом случаеclassилиstructдолжно быть первым по порядку накладываемым ограничением.
Ниже приведен пример, демонстрирующий наложение ограничения ссылочного типа.
// Продемонстрировать наложение ограничения ссылочного типа.
using System;
class MyClass {
//...
}
// Наложить ограничение ссылочного типа, class Test
Т obj;
public Test {
// Следующий оператор допустим только потому, что // аргумент Т гарантированно относится к ссылочному // типу, что позволяет присваивать пустое значение, obj = null;
}
// ...
}
class ClassConstraintDemo { static void Main {
// Следующий код вполне допустим, поскольку MyClass является классом. Test
// Следующая строка кода содержит ошибку, поскольку // int относится к типу значения.
// Test
}
}
Обратите внимание на следующее объявление классаTest, class Test