Спецификация .NET определяет, как следует использовать ограничения конструктора? - PullRequest
1 голос
/ 17 ноября 2010

У меня был взгляд на спецификацию .NET CLI, и хотя он упоминает, что вы можете иметь ограничение конструктора по умолчанию для общего параметра типа, он не указывает ничего, что вы можете do с таким универсальным типом, чтобы фактически создать его.Каков официальный «spec» способ создания экземпляра универсального типа с ограничением конструктора?

Ответы [ 3 ]

1 голос
/ 17 ноября 2010

Просто:

public static void CreateThings<T>() where T : new() {
    T t = new T();
    // now either return t or do other things with it, particularly
    // when combined with interface constraints
}

Цитировать разделы спецификации из ECMA 334 v4

14.5.10.1 Выражения создания объекта

Тип объекта -Выражение создания должно быть типом класса, типом значения или параметром типа, имеющим ограничение конструктора или ограничение типа значения (§25.7).

...

В противном случае, если T является параметром типа:

  • Если присутствует A, возникает ошибка времени компиляции.
  • В противном случае, если T имеет конструктор-constraint или ограничение типа значения, результатом выражения objectcreation- является значение типа T.
  • В противном случае выражение создания объекта недопустимо и возникает ошибка времени компиляции.
0 голосов
/ 17 ноября 2010

Это не ограничение конструктора по умолчанию , это ограничение конструктора без параметров . Класс должен иметь конструктор без параметров, независимо от того, является ли этот конструктор неявно созданным конструктором по умолчанию или явно объявленным конструктором без параметров.

Оба эти класса удовлетворяют условию:

public class A {
}

public class B {
  public B() { }
}

Но не этот, так как не существует неявно созданного конструктора, если у вас есть явно объявленные конструкторы:

public class C {
  public C(int id) { }
}

Поскольку это конструктор без параметров, его можно использовать только одним способом:

T item = new T();

Странно, если в спецификации нет упоминания об этом, но, по крайней мере, это ясно описано в справочнике C # от MS: new Constraint . Однако спецификация не предназначена для чтения так же, как документация, поэтому может быть трудно найти, где именно она упоминается, и она может быть упомянута только один раз.

0 голосов
/ 17 ноября 2010

Вы можете использовать конструктор в универсальном типе:

return new T();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...