Freigeben über


Почему ограничения не выводятся автоматически?

Предположим, у вас есть базовый обобщенный тип с ограничением:

class Bravo<T> where T : IComparable<T> { ... }

При создании наследника, вида:

class Delta<U> : Bravo<U> { ... }

Компилятор выдаст ошибку:

error CS0314: The type 'U' cannot be used as type parameter 'T' in the generic type or method 'Bravo<T>'. There is no boxing conversion or type parameter conversion from 'U' to 'System.IComparable<U>'.

Что кажется разумным; любое создание Bravo<T> должно отвечать ограничению на T и мы не знаем, будет ли тип U отвечать этим ограничениям.

Но это взгляд на проблему лишь с одной стороны; если посмотреть с другой стороны, то мы знаем, что тот, кто будет объявлять тип U,ожидает, что Uбудет отвечать ограничениям типа T, поскольку использует тип U в качестве типа T. В таком случае, мы можем ожидать, что компилятор мог бы молча добавить то же самое ограничение для типа U. В таком случае, ограничения типа U соответствовали бы ограничениям типа T; тогда любые ошибки ограничения типов при создании Delta<U>, говорили бы не о нарушении ограничений класса Delta, а о нарушении ограничений класса Bravo<T>.

У меня часто спрашивают, почему в компиляторе нет того и нет сего и я обычно отвечаю одно и то же: потому что никто этого не реализовал. Любая возможность начинает свою жизнь, как нереализованная и становится реализованной только после приложения определенных усилий: нет усилий – нет возможности. Конечно, это неудовлетворительный ответ, поскольку, когда человек задает подобный вопрос, он предполагает, что очевидно, эта возможность настолько хороша, что у нас должны быть причина не реализовывать ее. И я вас уверяю, что нам не нужны никакие причины для того, чтобы не реализовывать некоторую возможность, насколько бы она не выглядела привлекательной. Но, как я уже сказал, может быть интересным рассмотреть, какие есть за и против, если мы решимся реализовать возможность «автоматического вывода ограничений обобщенных параметров».

По мере развития языка C#, явно будет появляться все больше и больше возможностей, включающих автоматический вывод типов компилятором.

Оригинал статьи