Больше мелочей, чем действительно важно: почему нет ограничения new () на Activator.CreateInstance <T>()? - PullRequest
12 голосов
/ 04 марта 2011

Я думаю, что есть люди, которые могут ответить на этот вопрос, из любопытства:

Универсальный метод 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 ().При таких обстоятельствах данный ответ кажется единственной уважительной причиной не ограничивать метод ...

Спасибо за просмотр!

1 Ответ

8 голосов
/ 04 марта 2011

Я могу ошибаться, но главное преимущество, которое я вижу, состоит в том, что оно позволяет вам сделать что-то вроде этого:

// Simple illustration only, not claiming this is awesome code!
class Cache<T>
{
    private T _instance;

    public T Get()
    {
        if (_instance == null)
        {
            _instance = Create();
        }

        return _instance;
    }

    protected virtual T Create()
    {
        return Activator.CreateInstance<T>();
    }
}

Обратите внимание, что если Activator.CreateInstance<T> имеет ограничение where T : new(), товышеприведенный класс Cache<T> будет также нуждаться в этом ограничении, которое будет чрезмерно ограничительным, поскольку Create является виртуальным методом, и некоторый производный класс может захотеть использовать другие средства создания экземпляров, такие как вызов типавнутренний конструктор или метод статического компоновщика.

...