Почему класс не может расширить свой собственный вложенный класс в C#?

Выполните yarn remove для каждого из пакетов зависимостей в package.json (записи dependencies и devDependencies). Это должно удалить все зависимости, включая все промежуточные зависимости из yarn.lock.

P.S. Пара рекомендованных инструментов:

31
задан Tinister 5 November 2008 в 15:58
поделиться

5 ответов

Нет никакого неявного наследования, включенного насколько я могу сказать. Я ожидал бы, что это будет хорошо - хотя я могу вообразить странность, если A и B были универсальны.

Это указано в разделе 10.1.4 из спецификации:

, Когда класс B происходит из класса A, это - ошибка времени компиляции для для зависимости от B. Класс непосредственно зависит от своего прямого базового класса (если таковые имеются), и непосредственно зависит от класса, в котором он сразу вкладывается (если таковые имеются). Учитывая это определение, полный набор классов, от которых зависит класс, является переходным закрытием, непосредственно зависит от отношений.

я выделил соответствующий раздел.

, Который объясняет, почему компилятор отклоняет его, но не, почему язык запрещает его. Интересно, существует ли ограничение CLI...

РЕДАКТИРОВАНИЕ: Хорошо, у меня был ответ от Eric Lippert. В основном это было бы технически возможно (нет ничего в CLI для запрещения его), но:

  • Разрешение это было бы трудно в компиляторе, делая недействительным различные текущие предположения вокруг упорядочивания и циклов
  • , Это - довольно нечетное проектное решение, которое легче запретить, чем поддерживать

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

A.B x = new A.B.B.B.B.B.B.B.B.B.B.B.B();

..., но это уже было бы (как отмечено Tinister) быть допустимым если B, полученный из A.

Вложение + наследование = нечетность...

34
ответ дан 27 November 2019 в 22:30
поделиться

Я думаю, что вложение предназначено для представления этого, вложенный тип часть определения вложенного типа. С той интерпретацией ограничение имеет смысл, потому что в то время, когда компилятор поражает определение A, A.B еще не определяется, и даже в конце A, это уже определяется с точки зрения A.B.

0
ответ дан 27 November 2019 в 22:30
поделиться

Относительно вопросов о том, что я пытался сделать:

В основном, я хотел создать класс, который имел отношения состава с собой, но я не хотел иметь содержащий в нем объект, чтобы содержать другие объекты и поэтому создать цепочку со многими "-A имеет - A имеет - A имеет-..." отношения. Таким образом, моя мысль в то время была, делают что-то вроде этого:

public class A : A.AA
{
    public class AA
    {
        // All of the class's logic
    }

    private AA _containedObject;
}

, Который в то время казался довольно гладким, но ретроспективно я не так уверен...

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

Однако в рамках комментариев сообщение в Блоге Eric Lippert он дает примеры класса, реализовывая вложенный интерфейс, а также класс, реализовывая универсальный интерфейс с вложенным классом как аргумент типа (который не компилирует, и он называет "ошибку" в текущем компиляторе). Оба из тех примеров касаются интерфейсов, таким образом, я задавался вопросом, были ли некоторые специальные правила с вложенными классами. И кажется, что существует.

0
ответ дан 27 November 2019 в 22:30
поделиться

Это не вещь C# так же, как это - вещь компилятора. Одно из заданий компилятора должно разметить класс в памяти, которая является набором типов основных данных, указателей, указателей функции и других классов.

Это не может создать расположение для класса A, пока это не знает, каково расположение класса B. Это не может знать то, чем состоит в том расположение класса B, пока это не закончилось с расположением класса A. Круговая зависимость.

13
ответ дан 27 November 2019 в 22:30
поделиться

Это не имеет никакого смысла мне... Вы пытаетесь расширить что-то, что не существует!!! Класс B только существует в пределах класса A, и из-за этого я думаю, что существует некоторое наследование.

-2
ответ дан 27 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: