out (المعدّل العام) (مرجع #C)

تطبيقا على معلمات الأنواع العامة، الكلمة الأساسية out تجعل معلمة النوع covariant. يمكنك استخدام الكلمة الأساسية out في الواجهات العامة و المفوضين.

التباين المشترك يتيح لك استخدام نوع مشتق أكثر مما هو محدد بواسطة المعلمة العامة. وهذا يسمح للتحويل الضمني للفئات التي تنفذ واجهات متغير والتحويل الضمني لأنواع المفوض. التباين المشترك والتباين المضاد مدعومان لأنواع المرجع وسكن ليس مدعومان لأنواع القيمة.

تمكن الواجهة الذي تحتوي على معلمة نوع covariant أساليبها إلى إرجاع أنواع مشتقة أكثر من تلك المحددة بواسطة معلمة النوع. على سبيل المثال، (لأنه في .NET Framework 4) في IEnumerable<T>، النوع T عبارة عن covariant، يمكنك تعيين أي كائن من نوع IEnumerabe(Of String) إلى كائن من نوع IEnumerable(Of Object) دون استخدام أية أساليب تحويل خاصة.

يمكن تعيين تفويض covariant لتفويض آخر من نفس النوع، ولكن مع معلمة نوع عامة أكثر اشتقاقاً.

لمزيد من المعلومات، راجع التباين المشترك و Contravariance في (C#و Visual Basic).

مثال

ويبين المثال التالي كيفية إعلان وتوسيع وتنفيذ واجهة covariant عامة. كما يوضح كيفية استخدام التحويل الضمني للفئات التي تقوم بتطبيق واجهة covariant.

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

في الواجهة العامة يمكن تعريف معلمة النوع covariant إذا كانت تحقق الشروط التالية:

  • تستخدم معلمة النوع فقط كنوع إرجاع لأساليب الواجهة ولا تستخدم كنوع لوسيطات أسلوب.

    ملاحظة

    وجود استثناء واحد هو إلى هذه قاعدة. إذا كان لديك تفويض عام contravariant في واجهة covariant كمعلمة أسلوب يمكنك استخدام نوع الـ covariant كمعلمة نوع عام لهذا التفويض. للحصول على معلومات أكثر حول تفويضات covariant العامة وتفويضات contravariant العامة، راجع الفرق في المفوضون (C# و Visual Basic) و استخدام الفرق Func و إجراء التفويضات العام (C# و Visual Basic).

  • لا يتم استخدام معلمة النوع كقيد عام لأساليب الواجهة.

ويبين المثال التالي كيفية إنشاء مثيل وتعريف واستدعاء تفويض covariant عام. كما يوضح كيفية تحويل أنواع التفويضات ضمنيًا.

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

في التفويض العام، يمكن تعريف النوع كـ covariant إذا كان يُستخدم فقط كنوع إرجاع للأسلوب ولا يُستخدم لوسيطات الأسلوب.

مواصفات لغة #C

لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.

راجع أيضًا:

المرجع

(المعدّل العام) ( مرجع C# )

المعدّلات (مرجع #C)

المبادئ

الالفرق في الواجهات العامة (C# و Visual Basic)