Выбор синтаксиса для параметра типа дисперсии в C # и VB - PullRequest
3 голосов
/ 12 апреля 2010

В C # и VB модификаторы параметров типа используются для выражения дисперсии параметров типа. Например, версия C # выглядит так:

interface Foo<in X, out Y> { }

и версия VB выглядит следующим образом:

Interface Foo(Of In X, Out Y)

End Interface

Поскольку спецификации отклонений в основном ограничивают, где и как можно использовать параметр типа, я склонен думать о них как о дополнительных ограничениях на параметры типа.

Мне просто любопытно, почему они так не представлены. Я имею в виду, почему они представлены в обоих языках как дополнительные модификаторы параметров типа, а не добавлены в список ограничений типа? Если бы это были ограничения типа, версия C # выглядела бы так:

interface Foo<X, Y> where X:in where Y:out { }

и версия VB выглядела бы так:

Interface Foo(Of X As In, Y As Out)

End Interface

Итак, кто-нибудь знает, было ли какое-то обоснование выбора конкретного синтаксиса для выражения дисперсии параметра типа в этих языках, или это было просто случайным?

1 Ответ

2 голосов
/ 12 апреля 2010

Я думаю, что языковые дизайнеры сделали хороший выбор здесь.

Причина этого заключается в том, что ковариация и контравариантность - это не ограничения типа (X / Y в вашем случае), а скорее самого интерфейса.

Если вы использовали синтаксис where X: in или Of X As In, вы предлагаете ограничение на типа X . Однако ковариация и контравариантность действительно являются «ограничениями» для самого интерфейса - как универсальный тип интерфейса будет использовать тип «T». Например, говоря:

interface Foo<out X> {}

Вы говорите: «Этот интерфейс использует только X в качестве выхода», что на самом деле говорит о том, что вы ограничиваете ваше использование X в способ, который позволяет ковариации.

Это очень отличается от того, чтобы сказать "X должен быть ограничен определенным типом", поскольку это не является ограничением для X.

Благодаря введению нового синтаксиса разработчики языка позволили нам более эффективно осмыслить это, не смешивая сообщения.

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