Почему нельзя указывать прототип конструктора, отличный от new(), в ограничениях генериков в C#?

C# net

Генерики в C# (ревизия языка начиная с 2.0) позволяют указывать ограничения (where-предложение), среди которых есть ограничение на прототип конструктора. Странно, но можно указать только прототип конструктора по умолчанию: new().
Пример возможного использования (генерик-метод) произвольного прототипа:
public class Bar {
public T Foo<T>(int x, string y) where T: new(int, string) {
return new T(x, y);
}
}

Подобное ограничение в настоящий момент приходится обходить используя Activator.CreateInstance, что конечно, не так изящно, как хотелось бы:
public class Bar {
public T Foo<T>(int x, string y) {
return (T)Activator.CreateInstance(typeof(T), x, y);
}
}

Примечание:
2Цыба
На некотором этапе трансляции компилятор естественно имеет информацию о конструкторах подставляемых типов, будь они внешними (определены во внешних сборках) или внутренними (определены в той же программе). Если тип не имеет конструктора с требуемым прототипом должна происходить ошибка компиляции.
Мне все же мыслится, что это ограничение платформы, но ни как не языка - во всяком случае нужно попробовать покопать в этом направлении.
Ответы:
Потому что компилятор должен быть уверен в том, что знает, какой из конструкторов в обобщённом типе может быть всегда. Насколько я понимаю, таковым является только конструктор T().


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.