Есть ли причина, по которой Microsoft не добавила эту функцию в язык?
Функция, которую вы описываете, является частным случаем более общей функции "разрешить ограничение"это требует определенного метода для существования ".Например, вы можете сказать:
void M<T>(T t) where T has an accessible method with signature double Foo(int)
{
double x = t.Foo(123);
}
У нас нет этой функции в C #, потому что функции должны быть подтверждены анализом затрат и выгод.Это было бы довольно дорогой функцией как с точки зрения дизайна, так и с точки зрения реализации - функция, которая предъявляла бы требования не только к C #, но и ко всем языкам .NET.Какая значительная выгода оправдывает эту функцию?
Более того: предположим, что мы разработали эту функцию. Как бы это было эффективно реализовано ?Ограничения в общей системе типов были тщательно спроектированы так, чтобы джиттер мог генерировать эффективный код один раз , который затем может использоваться совместно для каждого ссылочного типа.Как бы мы сгенерировали эффективный код для сопоставления с произвольным методом?Такая эффективная диспетчеризация довольно проста, когда слот метода может быть известен во время компиляции;с этой функцией у нас больше не будет этого преимущества.
Функция, которую вы хотите, - это та же самая функция, только с видом метода, ограниченным конструктором.
Помните, что цель обобщений состоит в том, чтобы позволить вам написать обобщенно напечатанный код.Если вам требуются более конкретные ограничения, чем те, которые могут быть зафиксированы в системе типов 1023 *, возможно, вы пытаетесь использовать ненормативную лексику.