C # дисперсионная аннотация параметра типа, ограниченная значением типа - PullRequest
41 голосов
/ 20 февраля 2012

В C # можно добавить аннотацию отклонения к параметру типа, ограниченному типом значения:

interface IFoo<in T> where T : struct
{
  void Boo(T x);
}

Почему это разрешено компилятором, если аннотация отклонения не имеет никакого смысла в такой ситуации?

Ответы [ 2 ]

36 голосов
/ 20 февраля 2012

Почему это разрешено компилятором, так как аннотация отклонений не имеет никакого смысла в такой ситуации?

Это разрешено компилятором, потому что я даже не думал, что кто-то может попытаться сделать это, когда я добавлю правила дисперсии в компилятор C # 4.0.

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

Теперь, когда вы обратили на это мое внимание, возникает вопрос: должно ли быть функцией? Должен ли компилятор выдавать предупреждение (или ошибку) для этого случая?

Это призыв к суду. Мы хотели бы рассмотреть несколько вещей:

  • Является ли код тем, что кто-то может напечатать, думая, что он делает что-то разумное? Надеюсь, что нет; Можно надеяться, что разработчик, который знает достаточно о системе типов, чтобы создать вариант интерфейса, также знает, что дисперсия работает только с ссылочными типами. Но, возможно, есть разработчики, которые могли бы напечатать это, думая, что это будет работать. По крайней мере, это не кажется невероятным. Это не совсем придумано.

  • Код явно неправильный ? Да, это возможно. Кажется очень маловероятным, что кто-то сознательно хочет написать интерфейс, который выглядит вариант, но на самом деле это не так.

и так далее.

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

Спасибо за идею!

2 голосов
/ 20 февраля 2012

Это разрешено просто потому, что это юридический код. В этом нет абсолютно никакого вреда. Да, вы не можете использовать контравариантное преобразование, но я не вижу проблемы. Ничто в коде на самом деле не будет вводить в заблуждение или скрывать некоторые извращенные gotcha .

Я просто думаю, что компилятор не проверяет, является ли T типом значения или типом ссылки при проверке достоверности отклонений. Само собой разумеется, что команда C # предположила, что любой, кто использует универсальную дисперсию интерфейса, будет знать, что делать это с типами значений бессмысленно и ни в коем случае не иметь побочных эффектов.

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