out (универсальный модификатор) (Справочник по C#)out (Generic Modifier) (C# Reference)

Для параметров универсального типа ключевое слово out указывает, что параметр типа является ковариантным.For generic type parameters, the out keyword specifies that the type parameter is covariant. Ключевое слово out может применяться в универсальных интерфейсах и делегатах.You can use the out keyword in generic interfaces and delegates.

Ковариация позволяет использовать производные типы со степенью наследования больше, нежели у типа, заданного универсальным параметром.Covariance enables you to use a more derived type than that specified by the generic parameter. Благодаря этому можно осуществлять неявное преобразование классов, реализующих вариантные интерфейсы, и неявное преобразование типов делегатов.This allows for implicit conversion of classes that implement variant interfaces and implicit conversion of delegate types. Ковариация и контравариантность поддерживаются для ссылочных типов, но не для типов значений.Covariance and contravariance are supported for reference types, but they are not supported for value types.

Интерфейс с параметром ковариантного типа позволяет своим методам возвращать аргументы производных типов, степень наследования у которых больше, чем у параметра типа.An interface that has a covariant type parameter enables its methods to return more derived types than those specified by the type parameter. Например, так как в .NET Framework 4 в IEnumerable<T> тип T является ковариантным, можно назначить объект типа IEnumerable(Of String) объекту типа IEnumerable(Of Object) без применения каких-либо специальных методов преобразования.For example, because in .NET Framework 4, in IEnumerable<T>, type T is covariant, you can assign an object of the IEnumerable(Of String) type to an object of the IEnumerable(Of Object) type without using any special conversion methods.

Ковариантный делегат может быть назначен другому делегату того же типа, но с производным параметром универсального типа большей степени.A covariant delegate can be assigned another delegate of the same type, but with a more derived generic type parameter.

Дополнительные сведения см. в разделе Ковариация и контравариантность.For more information, see Covariance and Contravariance.

ПримерExample

В следующем примере показано, как объявить, расширить и реализовать ковариантный универсальный интерфейс.The following example shows how to declare, extend, and implement a covariant generic interface. В нем также показано, как использовать неявное преобразование для классов, реализующих ковариантный интерфейс.It also shows how to use implicit conversion for classes that implement a covariant interface.

// 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;
    }
}

В универсальном интерфейсе параметр типа может быть объявлен ковариантным, если он удовлетворяет следующим условиям:In a generic interface, a type parameter can be declared covariant if it satisfies the following conditions:

  • Параметр типа используется только в качестве типа значения, возвращаемого методами интерфейса, и не используется в качестве типа аргументов метода.The type parameter is used only as a return type of interface methods and not used as a type of method arguments.

    Примечание

    Существует одно исключение из данного правила.There is one exception to this rule. Если в ковариантном интерфейсе в качестве параметра метода используется контравариантный универсальный делегат, ковариантный тип можно использовать в качестве параметра универсального типа для этого делегата.If in a covariant interface you have a contravariant generic delegate as a method parameter, you can use the covariant type as a generic type parameter for this delegate. Дополнительные сведения о ковариантных и контравариантных универсальных методах-делегатах см. в разделе Вариативность в делегатах и Использование вариативности в универсальных методах-делегатах Func и Action.For more information about covariant and contravariant generic delegates, see Variance in Delegates and Using Variance for Func and Action Generic Delegates.

  • Параметр типа не используется в качестве универсального ограничения для методов интерфейса.The type parameter is not used as a generic constraint for the interface methods.

ПримерExample

В следующем примере кода показано, как объявить ковариантный универсальный метод-делегат.The following example shows how to declare, instantiate, and invoke a covariant generic delegate. В нем также показано, как выполнить неявное преобразование типов делегатов.It also shows how to implicitly convert delegate types.

// 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(); 
}

В универсальном методе-делегате тип может быть объявлен ковариантным, если он используется только как тип значения, возвращаемого методом, и не используется для аргументов метода.In a generic delegate, a type can be declared covariant if it is used only as a method return type and not used for method arguments.

Спецификация языка C#C# Language Specification

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee Also

Расхождение в универсальных интерфейсахVariance in Generic Interfaces
inin
МодификаторыModifiers