Я знаю, что система типа Java является необоснованной (он не может вводить проверки, которые являются семантически законными) и неразрешимым (он не может ввести проверку некоторой конструкции).
Например, если вы скопируете/вставьте следующий фрагмент в класс и скомпилируете его, компилятор сработает с StackOverflowException
(как apt). Это неразрешимость.
static class ListX<T> {}
static class C<P> extends ListX<ListX<? super C<C<P>>>> {}
ListX<? super C<Byte>> crash = new C<Byte>();
Java использует подстановочные знаки с ограничениями типов, которые являются формой дисперсии использования сайта. С#, с другой стороны, использует аннотацию вариации сайта объявления (с ключевыми словами in
и out
). Известно, что дисперсия объявления-сайта слабее, чем дисперсия на сайте-участнике (вариация на сайте-участнике может выражать все отклонения от объявлений-сайтов, а более - в нижней части, это гораздо более подробный).
Итак, мой вопрос: Является ли система С# звуковой и разрешимой? Если нет, то почему?