Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для параметров универсального типа ключевое out слово указывает, что параметр типа является ковариантным. Используйте ключевое out слово в универсальных интерфейсах и делегатах.
Ковариация позволяет использовать более производный тип, чем указывает универсальный параметр. Эта функция позволяет неявно преобразовать классы, реализующие ковариантные интерфейсы и неявное преобразование типов делегатов. Ковариантность и контравариантность поддерживают ссылочные типы, но они не поддерживают типы значений.
Интерфейс с параметром типа ковариантного типа позволяет методам возвращать больше производных типов, чем указанные параметром типа. Например, так как в .NET тип IEnumerable<T>T является ковариантным, можно назначить объект IEnumerable<string> типа объекту IEnumerable<object> типа типа без использования специальных методов преобразования.
Можно назначить ковариантный делегат другому делегату того же типа, но с более производным параметром универсального типа.
Дополнительные сведения см. в разделе Ковариантность и контравариантность.
Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.
Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.
Подсказка
Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.
В следующем примере показано, как объявить, расширить и реализовать ковариантный универсальный интерфейс. В нем также показано, как использовать неявное преобразование для классов, реализующих ковариантный интерфейс.
// Covariant interface.
interface ICovariant<out R> { }
// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }
// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }
class Program
{
static void Test()
{
ICovariant<Object> iobj = new Sample<Object>();
ICovariant<String> istr = new Sample<String>();
// You can assign istr to iobj because
// the ICovariant interface is covariant.
iobj = istr;
}
}
В универсальном интерфейсе объявите ковариантный параметр типа, если он удовлетворяет следующим условиям:
Параметр type используется только в качестве возвращаемого типа методов интерфейса и не используется в качестве типа аргументов метода.
Замечание
Существует одно исключение из этого правила. Если в ковариантном интерфейсе есть контравариантный универсальный делегат в качестве параметра метода, можно использовать ковариантный тип в качестве параметра универсального типа для этого делегата. Дополнительные сведения о ковариантных и контрвариантных универсальных делегатах см. в разделе " Вариативность" в делегатах и использовании вариативности для func и Action Generic Delegates.
Параметр типа не используется в качестве универсального ограничения для методов интерфейса.
В следующем примере показано, как объявить, создать экземпляр и вызвать ковариантный универсальный делегат. В нем также показано, как неявно преобразовать типы делегатов.
// Covariant delegate.
public delegate R DCovariant<out R>();
// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }
public static Button SampleButton()
{ return new Button(); }
public void Test()
{
// Instantiate the delegates with the methods.
DCovariant<Control> dControl = SampleControl;
DCovariant<Button> dButton = SampleButton;
// You can assign dButton to dControl
// because the DCovariant delegate is covariant.
dControl = dButton;
// Invoke the delegate.
dControl();
}
В универсальном делегате объявите тип ковариант, если он используется только в качестве типа возвращаемого метода, а не для аргументов метода.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является авторитетным источником синтаксиса и использования языка C#.
См. также
- Дисперсия в универсальных интерфейсах
- в
- модификаторы