Ошибка компилятора CS0304
Невозможно создать экземпляр типа переменной "type", потому что он не имеет ограничения new()
Если при реализации универсального класса требуется с помощью ключевого слова new
создать экземпляр любого типа, задаваемого для параметра типа T
, необходимо применить ограничение new() к типу T
в объявлении класса, как показано в следующем примере.
class C<T> where T : new()
Ограничение new()
усиливает безопасность типа, гарантируя, что у любого конкретного типа, предоставляемого для T
, имеется конструктор без параметров. Ошибка CS0304 возникает при попытке использования оператора new
в теле класса для создания экземпляра параметра типа T
, если тип T
не задает ограничение new()
. На стороне клиента код, пытающийся создать экземпляр универсального класса с типом, не обладающим конструктором без параметров, приведет к возникновению ошибки компилятора CS0310.
Следующий пример приводит к возникновению ошибки CS0304.
// CS0304.cs
// Compile with: /target:library.
class C<T>
{
// The following line generates CS0304.
T t = new T();
}
Оператор new
также недопустим в методах класса.
// Compile with: /target:library.
class C<T>
{
public void ExampleMethod()
{
// The following line generates CS0304.
T t = new T();
}
}
Чтобы избежать возникновения этой ошибки, следует объявить класс с помощью ограничения new()
, как показано в следующем примере.
// Compile with: /target:library.
class C<T> where T : new()
{
T t = new T();
public void ExampleMethod()
{
T t = new T();
}
}
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по