Ответ 1
Это новое ограничение.
Он указывает, что T
не должен abstract и должен выставить public parameterless конструктор, чтобы использовать его как общий аргумент типа для класса AuthenticationBase<T>
.
В WCF RIA Services есть класс AuthenticationBase
. Определение класса выглядит следующим образом:
// assume using System.ServiceModel.DomainServices.Server.ApplicationServices
public abstract class AuthenticationBase<T>
: DomainService, IAuthentication<T>
where T : IUser, new()
Что означает new()
в этом коде?
Это новое ограничение.
Он указывает, что T
не должен abstract и должен выставить public parameterless конструктор, чтобы использовать его как общий аргумент типа для класса AuthenticationBase<T>
.
При использовании ключевого слова new() требуется, чтобы для указанного класса был определен конструктор по умолчанию. Без ключевого слова попытка класса new() не будет компилироваться.
Например, следующий фрагмент не будет компилироваться. Функция попытается вернуть новый экземпляр параметра.
public T Foo <T> ()
// Compile error without the next line
// where T: new()
{
T newInstance = new T();
return newInstance;
}
Это ограничение общего типа. См. Статью MSDN.
Это означает, что тип, используемый для заполнения общего параметра T
, должен иметь открытый и безпараметрический конструктор. Если тип не реализует такой конструктор, это приведет к ошибке времени компиляции.
Если применяется стандартное ограничение new()
, как в этом примере, которое позволяет классу или методу (класс AuthenticationBase<T>
в этом случае) вызвать new T();
для создания нового экземпляра указанного типа. Другого пути, кроме рефлексирования (это включает в себя использование System.Activator
, для создания нового объекта родового типа.