بث و تحويلات (F#)

يصف هذا الموضوع لدعم نوع تحويلات في ب #.

أنواع حسابي

F# توفر عوامل التحويل في عمليات حسابية تحويل بين الأنواع الأولية المختلفة، مثل بين عدد صحيح و فاصلة عائمة أنواع. تم التحقق من عوامل تحويل تكاملاً والحرف و غير محدد النماذج؛ عائم أشر العوامل enumهل عامل تحويل عدم. إلغاء محدد النماذج التي تم تعريفها في Microsoft.FSharp.Core.Operatorsو محدد النماذج التي تم تعريفها في Microsoft.FSharp.Core.Operators.Checked. تحقق من تجاوز النماذج المحددة وإنشاء استثناء وقت تشغيل إذا تجاوزت القيمة الناتجة لحدود الهدف نوع.

كل من هذه العوامل له نفس الاسم كاسم لنوع وجهة. على سبيل المثال، في التعليمة البرمجية التالية، التي أنواع يتم بشكل صريح annotated، byteتظهر مع جهازي معاني مختلفة. التواجد أول نوع والثاني هو عامل تحويل.

let x : int = 5

let b : byte = byte x

يعرض الجدول التالي تحويل عوامل تشغيل المعرفة في ب #.

العامل

الوصف

byte

تحويل إلى بايت، نوع 8 بت بدون إشارة.

sbyte

تحويل إلى موقعة بايت.

int16

تحويل إلى عدد صحيح ذو إشارة 16 بت.

uint16

تحويل إلى عدد صحيح بلا إشارة 16 بت.

int32, int

تحويل إلى عدد صحيح ذو إشارة 32 بت.

uint32

تحويل إلى عدد صحيح بلا إشارة 32 بت.

int64

تحويل إلى عدد صحيح ذو إشارة 64 بت.

uint64

تحويل إلى عدد صحيح بلا إشارة 64 بت.

nativeint

التحويل إلى الأصلية عدد صحيح.

unativeint

تحويل إلى عددا صحيحاً غير موقعة أصلي.

float, double

تحويل إلى IEEE الدقة المزدوجة من النوع 64 بت فاصلة عائمة رقم.

float32, single

تحويل إلى رقم النقطة العائمة IEEE مفرد للدقة 32 بت.

decimal

تحويل إلى System.Decimal.

char

تحويل إلى System.Char، حرف Unicode.

enum

تحويل إلى نوع قائمة تعداد.

بالإضافة إلى أساسية مضمنة أنواع، يمكنك استخدام هذه العوامل مع أنواع التي تطبق op_Explicitأو op_Implicitالأساليب باستخدام التواقيع المناسبة. على سبيل المثال، intعامل تحويل يعمل مع أي نوع والتي توفر طريقة ثابتة op_Explicitالتي تأخذ النوع كـ معلمة وإرجاع int.

أنواع التي تم تعدادها

enumالعامل هو عامل تشغيل عام يأخذ أحد نوع المعلمة التي تمثل نوع من enumللتحويل إلى. عند ذلك بتحويل إلى نوع قائمة تعداد، اكتب الاستخراج محاولات لتحديد النوع enumالذي تريد تحويله إلى. في ما يلي مثال، متغير col1هو عدم وضوح annotated، ولكن يتم الاستدلال به نوع من اختبار. مساواة لاحق ولذلك، المحول البرمجي يمكن deduce على أن تقوم بتحويله إلى Colorالتعداد. بدلاً من ذلك، يمكنك توفير تعليق توضيحي نوع، كـ بواسطة col2في المثال التالي.

type Color =
    | Red = 1
    | Green = 2
    | Blue = 3

// The target type of the conversion is determined by type inference.
let col1 = enum 1
// The target type is supplied by a type annotation.
let col2 : Color = enum 2 
do
    if (col1 = Color.Red) then
       printfn "Red"

أنواع كائن الأخرى

تحويل بين أنواع في التسلسل هرمي لكائن هو أساسيا برمجة موجهة للكائن. هناك اثنين الأساسية أنواع لتحويل المستندات: بث لأعلى (upcasting) و الأخرى أسفل (downcasting). بث لأعلى تسلسل هرمي يعني النوع من مرجع كائن مشتقة إلى مرجع كائن أساسي. فريق العمل مثل هو ضمان عمل طالما فئة Base هو في هيكلي للوراثة من فئة مشتقة. بث لأسفل التسلسل هرمي، من مرجع كائن أساسي لمرجع كائن مشتق، تنجح فقط إذا كان الكائن فعلياً هو مثيل لنوع وجهة الصحيحة (المشتق) أو نوع مشتق من نوع وجهة.

F# يوفر عوامل التشغيل هذه أنواع لتحويل المستندات. :>قوالب عامل لأعلى هيكلي، و :?>casts عامل تشغيل لأسفل هيكلي.

upcasting

في العديد من الكائنات ذات اللغات، upcasting هو الضمنية؛ في F#, تكون القواعد مختلفة نوعا ما. upcasting هو تطبيقها تلقائياً عند تمرير الوسائط إلى وظائف تشغيل نوع كائن. ومع ذلك، لوظائف تمكنك من حدود في وحدة نمطية، upcasting هو لا تلقائياً، إلا إذا اكتب معلمة هو تم تعريفه كنوع مرنة. لمزيد من المعلومات، راجع أنواع مرونة (F#).

:>تنفذ عامل ثابت بتحويل، مما يعني أنه نجاح فريق العمل هو تحديد في وقت التحويل البرمجي. إذا كان فريق العمل الذي يستخدم :>تجميع بنجاح، فإنه هو تحويل صحيح وقد لا توجد فرصة للفشل في وقت التشغيل.

يمكنك أيضا استخدام upcastoperaإلىr إلى القيام بمثل تحويل. التالي تعبير يحدد تحويل أعلى هيكلي.

upcast expression

عندما كنت استخدم عامل upcast، المحول البرمجي يحاول الاستدلال نوع التحويل إلى من سياق. إذا كان المحول البرمجي هو المحول البرمجي غير قادر على تحديد نوع الهدف، عن خطأ.

Downcasting

:?>يقوم العامل حيوي بتحويل، مما يعني أنه نجاح فريق العمل هو تحديد في وقت التشغيل. فريق العمل الذي يستخدم :?>العامل هو عدم تدقيق في وقت التحويل البرمجي؛ ولكن في وقت التشغيل، ومحاولة هو التي تم إجراؤها على تحويل للنوع المحدد. إذا كان الكائن هو متوافق مع نوع الهدف، فريق العمل نجاح. إذا كان الكائن هو غير متوافق مع نوع الهدف، raهوes وقت التشغيل InvalidCastException.

يمكنك أيضا استخدام downcastoperaإلىr إلى القيام بتحويل نوع ديناميكي. تعيين التعبير التالي تحويل أسفل هيكلي إلى هو نوع يتم الاستدلال من سياق البرنامج.

downcast expression

لعامل upcast، إذا كان لا يمكن الاستدلال المحول البرمجي نوع هدف محدد من سياق، فإنه تقارير خطأ.

يلي تعليمات برمجية يوضح استخدم :>و :?>عوامل تشغيل. يوضح التعليمة البرمجية التي :?>العامل هو ويفضل استخدام إذا كنت تعرف أن تحويل سينجح، لأن ذلك يطرح InvalidCastExceptionإذا فشل تحويل. إذا لم تكن تعرف أنه سوف تنجح عملية تحويل، نوع الاختبار الذي يستخدم matchالتعبير الأفضل من حيث أنه تجنب مقدار الحمل لإنشاء الاستثناءات.

type Base1() =
    abstract member F : unit -> unit
    default u.F() =
     printfn "F Base1"

type Derived1() =
    inherit Base1()
    override u.F() =
      printfn "F Derived1"


let d1 : Derived1 = Derived1()

// Upcast to Base1.
let base1 = d1 :> Base1

// This might throw an exception, unless
// you are sure that base1 is really a Derived1 object, as
// is the case here.
let derived1 = base1 :?> Derived1

// If you cannot be sure that b1 is a Derived1 object,
// use a type test, as follows:
let downcastBase1 (b1 : Base1) =
   match b1 with
   | :? Derived1 as derived1 -> derived1.F()
   | _ -> ()

downcastBase1 base1

نظراً لعوامل تشغيل العام downcastو upcastتعتمد تشغيل استنتاج النوع لتحديد وسيطة وتقوم بإرجاع نوع، في الأتشغيل تعليمات برمجية، يمكنك استبدال

let base1 = d1 :> Base1

بكلمة

base1 = upcast d1

في السابق رمز نوع وسيطة وعد نوعان Derived1و Base1، على التوالي.

لمزيد من المعلومات حول نوع الاختبارات، راجع تطابق التعبيرات (F#).

راجع أيضًا:

موارد أخرى

مرجع لغة ب #