Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Для параметров универсального типа ключевое 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#.
См. также
- Дисперсия в универсальных интерфейсах
- в
- модификаторы