public class Bar {
public T Foo<T>(int x, string y) where T: new(int, string) {
return new T(x, y);
}
}
C#, ограничения генериков.
вопрос:
[quote=hardcase]
Почему нельзя указывать прототип конструктора, отличный от new(), в ограничениях генериков в C#?
Генерики в C# (ревизия языка начиная с 2.0) позволяют указывать ограничения (where-предложение), среди которых есть ограничение на прототип конструктора. Странно, но можно указать только прототип конструктора по умолчанию: new().
Пример возможного использования (генерик-метод) произвольного прототипа:
Подобное ограничение в настоящий момент приходится обходить используя Activator.CreateInstance, что конечно, не так изящно, как хотелось бы:
[/quote]
Покачто никто не ответил, может кто из наших может ответить?
Недавно на Гугловых Ответах задал
[quote=hardcase]
Почему нельзя указывать прототип конструктора, отличный от new(), в ограничениях генериков в C#?
Генерики в C# (ревизия языка начиная с 2.0) позволяют указывать ограничения (where-предложение), среди которых есть ограничение на прототип конструктора. Странно, но можно указать только прототип конструктора по умолчанию: new().
Пример возможного использования (генерик-метод) произвольного прототипа:
Код:
Код:
public class Bar {
public T Foo<T>(int x, string y) {
return (T)Activator.CreateInstance(typeof(T), x, y);
}
}
public T Foo<T>(int x, string y) {
return (T)Activator.CreateInstance(typeof(T), x, y);
}
}
Покачто никто не ответил, может кто из наших может ответить?
Наверное, потому что изначально архитекторы генериков решили, что реализация этой фичи - менее приоритетная задача по сравнению с остальными, которые им требовалось реализовать.
А раз она не была реализована в версии языка 3.0 - видимо, жалоб на отсутствие этой фичи было немного, или же их авторы (жалоб) не смогли донести их во "убедительном" виде до тех, кто разрабатывает генерики.
Вот так я думаю.
Цитата: Zorkus
Немного странно вопрос поставил ты.
Наверное, потому что изначально архитекторы генериков решили, что реализация этой фичи - менее приоритетная задача по сравнению с остальными, которые им требовалось реализовать.
Наверное, потому что изначально архитекторы генериков решили, что реализация этой фичи - менее приоритетная задача по сравнению с остальными, которые им требовалось реализовать.
Уверяю, она реализуется относительно элементарно (относительно лямбда-выражений) - я знаю толк в компиляторах.
Цитата: Zorkus
А раз она не была реализована в версии языка 3.0 - видимо, жалоб на отсутствие этой фичи было немного, или же их авторы (жалоб) не смогли донести их во "убедительном" виде до тех, кто разрабатывает генерики.
Вот так я думаю.
Вот так я думаю.
Не слишком убедительно. И, все же, я считаю эту фигню одним из промахов разработчиков. Очевидно однобокое решение.
Цитата: hardcase
Уверяю, она реализуется относительно элементарно (относительно лямбда-выражений) - я знаю толк в компиляторах.
Я не сказал, что ее сложно сделать. Я сказал - что это не было приоритетной задачей.
Цитата: hardcase
Не слишком убедительно. И, все же, я считаю эту фигню одним из промахов разработчиков. Очевидно однобокое решение.
Ну да, не спорю. В любой платформе, если покопаться, можно найти решения, которые очень многим покажутся однобокими.