Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Пропуск параметров типа

Пропуск параметров типа

При вызове обобщенных методов, подобных Swap‹T›, у ваc есть возможность не указывать параметр типа, но только в том случае, когда обобщенный метод требует указания аргументов, поскольку тогда компилятор может "выяснить" тип этих аргументов на основе вводимых параметров. Например, можно переставить два типа System.Boolean так.

// Компилятор будет предполагать System.Boolean.
bool b1 = true, b2 = false;
Console.WriteLine("До обмена: {0}, {1}", b1, b2);
Swap(ref b1, ref b2);
Console.WriteLine("После обмена: {0}, {1}", b1, b2);

Но если, например, у вас есть обобщённый метод с именем DisplayBaseClass‹T›, не имеющий входных параметров, как показано ниже:

static void DisplayBaseClass‹T›() {
 Console.WriteLine("Базовым классом {0} является: {1}.",  typeof(T), typeof(Т).BaseType);
}

то при вызове этого метода вы должны указать параметр типа.

static void Main(string[] args) {

 // Если метод не имеет параметров,
 // необходимо указать параметр типа.
 DisplayBaseClass‹int›();
 DisplayBaseClass‹string›();
 // Ошибка компиляции!
 // Нет параметров? Тогда должен быть заполнитель!
 DisplayBaseClass();
 …
}


Рис. 10.1. Обобщенные методы в действии

В данном случае обобщенные методы Swap‹T› и DisplayBaseClass‹T› были определены в рамках объекта приложения (т.е. в рамках типа, определяющего метод Main()). Если вы предпочтете определить эти члены в новом типе класса (MyHelperClass), то должны записать следующее.

public class MyHelperClass {
 public static void Swap‹T›(ref T a, ref T b) {
  Console.WriteLine("Методу Swap() передано {0}", typeof(T));
  T temp;
  temp = a;
  a = b;
  b = temp;
 }
 public static void DisplayBaseClass‹T›() {
  Console.WriteLine("Базовым классом {0} является: {1}.", typeof(T), typeof(T).BaseType);
 }
}

Обратите внимание на то, что тип MyHelperClass сам по себе не является обобщенным, но определяет два обобщенных метода. Так или иначе, теперь, когда методы Swap‹T› и DisplayBaseClass‹T› находятся в контексте нового типа класса, при вызове их членов придется указать имя типа.

MyHelperClass.Swap‹int›(ref a, ref b);

Наконец, обобщенные методы не обязаны быть статическими. Если бы Swap‹T› и DisplayBaseClass‹T› были методами уровня экземпляра, нужно было бы просто создать экземпляр MyHelperClass и вызвать их из объектной переменной.

MyHelperClass с = new MyHelperClass();
c.Swap‹int›(ref a, ref b);

Оглавление книги


Генерация: 1.980. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз