Ошибка компилятора 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();  
    }  
}  

См. также