Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.3.8.5Доступ к частным и защищенным членам типа-контейнера

Вложенный тип имеет доступ ко всем членам, к которым есть доступ из типа-контейнера, в том числе к членам типа-контейнера с объявленной доступностью private и protected. Пример.

using System;

class C { private static void F() { Console.WriteLine("C.F"); }

public class Nested { public static void G() { F(); } } }

class Test { static void Main() { C.Nested.G(); } }

показан класс C, содержащий вложенный класс Nested. Внутри Nested метод G вызывает статический метод F, определенный в C, а F имеет частную объявленную доступность.

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

using System;

class Base { protected void F() { Console.WriteLine("Base.F"); } }

class Derived: Base { public class Nested { public void G() { Derived d = new Derived(); d.F(); // ok } } }

class Test { static void Main() { Derived.Nested n = new Derived.Nested(); n.G(); } }

вложенный класс Derived.Nested обращается к защищенному методу F, определенному в Base, базовом классе класса Derived, вызовом через экземпляр класса Derived.

10.3.8.6Вложенные типы в универсальных классах

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

Каждое объявление типа, содержащееся внутри объявления универсального типа, неявно является объявлением универсального типа. При записи обращения к типу, вложенному в универсальный тип, сформированный тип-контейнер, включая его аргументы типа, должен быть именован. Однако изнутри внешнего класса вложенный тип можно использовать без уточнения; тип экземпляра внешнего класса может быть неявно использован при формировании вложенного типа. В следующем примере показаны три разных правильных способа обращения к сформированному типу, созданному из Inner; первые два способа эквивалентны.

class Outer<T> { class Inner<U> { public static void F(T t, U u) {...} }

static void F(T t) { Outer<T>.Inner<string>.F(t, "abc"); // These two statements have Inner<string>.F(t, "abc"); // the same effect

Outer<int>.Inner<string>.F(3, "abc"); // This type is different

Outer.Inner<string>.F(t, "abc"); // Error, Outer needs type arg } }

Хотя это плохой стиль программирования, параметр типа во вложенном типе может скрывать член или параметр типа, объявленный во внешнем типе:

class Outer<T> { class Inner<T> // Valid, hides Outer’s T { public T t; // Refers to Inner’s T } }

10.3.9Зарезервированные имена членов

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

Зарезервированные имена не вводят объявления, и таким образом не участвуют в поиске членов. Но подписи зарезервированного метода, связанные с объявлением, все же участвуют в наследовании (§10.3.3) и могут быть скрыты с помощью модификатора new (§10.3.4).

Резервирование этих имен служит трем целям:

  • разрешить базовой реализации использовать обычный идентификатор в качестве имени метода для получения или установки доступа к средствам языка C#;

  • разрешить другим языкам возможность взаимодействия, используя обычный идентификатор в качестве имени метода для получения или установки доступа к средствам языка C#;

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

Объявление деструктора (§10.13) также вызывает резервирование подписи (§10.3.9.4).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]