Просто любопытно: конечно, все мы знаем, что общий случай вывода типов для дженериков неразрешим. Таким образом, C # вообще не будет использовать какой-либо подтип: если Foo ‹T› является общим, Foo ‹int› не является подтипом Foo ‹T› или Foo ‹Object› или что-нибудь еще, что вы можете придумать. И, конечно же, мы все пытаемся обойти это с помощью уродливых интерфейсов или определений абстрактных классов.
Но ... если вы не можете решить общую проблему, почему бы просто не ограничить решение простыми случаями. Например, в моем списке выше ОЧЕРЕДНО, что Foo ‹int› является подтипом Foo ‹T›, и проверить это было бы тривиально. То же самое и с проверкой на Foo ‹Object›.
Так есть ли какой-нибудь другой глубокий ужас, который выползет из бездны, если они просто скажут: черт возьми, мы сделаем все, что в наших силах? Или это просто своего рода религиозная чистота со стороны языковых ребят из Microsoft?
Обновлять:
Это очень старая ветка. В наши дни в C # есть var, который решает половину того, на что я жаловался, а затем, используя стиль анонимных делегатов Linq, имеет отличную нотацию, позволяющую не вводить одно и то же дважды. Таким образом, каждый аспект того, против чего я возражал, был решен более свежими изменениями в C # (или, возможно, мне просто потребовалось время, чтобы узнать о вещах, которые только что были представлены, когда я опубликовал ветку ...) Я использую эти новые теперь в системе Isis2 есть функции для надежных облачных вычислений (isis2.codeplex.com), и я думаю, что в результате библиотека имеет очень чистый внешний вид. Проверьте это и дайте мне знать, что вы думаете). - Кен Бирман (июль 2014 г.)
public T Bar(T value){/*...*/}
. ДляFoo<object> foo = new Foo<object>();
это будет законным:object result = foo.Bar(0);
. Так будет:object result = foo.Bar("XYZ");
Однако дляFoo<object> foo = new Foo<int>();
только первый будет законным. - person phoog   schedule 22.12.2010