Что означает new()?

В WCF RIA Services есть класс AuthenticationBase. Определение класса выглядит следующим образом:

// assume using System.ServiceModel.DomainServices.Server.ApplicationServices

public abstract class AuthenticationBase<T> 
    : DomainService, IAuthentication<T> 
    where T : IUser, new()

Что означает new() в этом коде?

Ответы

Ответ 2

При использовании ключевого слова new() требуется, чтобы для указанного класса был определен конструктор по умолчанию. Без ключевого слова попытка класса new() не будет компилироваться.

Например, следующий фрагмент не будет компилироваться. Функция попытается вернуть новый экземпляр параметра.

public T Foo <T> ()
// Compile error without the next line
// where T: new()
{
    T newInstance = new T();
    return newInstance;
}

Это ограничение общего типа. См. Статью MSDN.

Ответ 3

Это означает, что тип, используемый для заполнения общего параметра T, должен иметь открытый и безпараметрический конструктор. Если тип не реализует такой конструктор, это приведет к ошибке времени компиляции.

Если применяется стандартное ограничение new(), как в этом примере, которое позволяет классу или методу (класс AuthenticationBase<T> в этом случае) вызвать new T(); для создания нового экземпляра указанного типа. Другого пути, кроме рефлексирования (это включает в себя использование System.Activator, для создания нового объекта родового типа.