Я думаю, что есть люди, которые могут ответить на этот вопрос, это вопрос из любопытства:
Универсальный метод CreateInstance
из System.Activator
, представленный в .NET v2, не имеет ограничений типа для универсального аргумента, но требует конструктора по умолчанию для активированного типа, иначе выдается MissingMethodException
. Мне кажется очевидным, что этот метод должен иметь ограничение типа, например
Activator.CreateInstance<T>() where T : new() {
...
}
Просто упущение или какой-то анекдот здесь скрывается?
Обновить
Как уже было сказано, компилятор не позволяет вам писать
private T Create<T>() where T : struct, new()
error CS0451: The 'new()' constraint cannot be used with the 'struct' constraint
Тем не менее, см. комментарии, структура может использоваться в качестве аргумента типа для универсального метода, определяющего ограничение new(). В этом случае данный ответ кажется единственной веской причиной не ограничивать метод...
Спасибо, что посмотрели это!
default(T)
. - person Adam Robinson   schedule 04.03.2011void Foo<T>() where T:new() {}
,Foo<DateTime>();
илиFoo<int>();
оба являются вполне допустимыми вызовами, на которые компилятор не будет жаловаться. - person Adam Robinson   schedule 04.03.2011new
, по-видимому, было введено одновременно с дженериками, так что это не похоже на проблему обратной совместимости. Может они просто забыли? - person StriplingWarrior   schedule 04.03.2011