سؤال

بالنظر إلى هذا الفئة مع مشغل ممثل ضمني:

public class MyDateTime
{
    public static implicit operator MyDateTime(System.Int64 encoded)
    {
        return new MyDateTime(encoded);
    }

    public MyDateTime(System.Int64 encoded)
    {
        _encoded = encoded;
    }
    System.Int64 _encoded;
}

يمكنني الآن القيام بما يلي:

long a = 5;
MyDateTime b = a;

ولكن ليس ما يلي:

long f = 5;
object g = f;
MyDateTime h = g;

هذا يعطي وقت ترجمة:

لا يمكن تحويل نوع "كائن" ضمنيًا إلى "myDateTime".

له معنى بالنسبة لي.

الآن أقوم بتعديل المثال السابق على النحو التالي:

long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;

هذا يجمع بشكل جيد. الآن أحصل على وقت تشغيل InvalidCastException:

غير قادر على إلقاء كائن من النوع 'System.Int64' لكتابة myDateTime '.

يخبرني هذا أنه يتم تطبيق مشغلي الممثلين الضمنيين في وقت الترجم فقط ، ولا يتم تطبيقه عندما يحاول وقت تشغيل .NET إلقاء كائن ديناميكيًا على نوع آخر.

أسئلتي:

  1. هل انا صائب؟
  2. هل هناك طريقة أخرى للقيام بذلك؟

بالمناسبة ، التطبيق الكامل هو أنني أستخدمه Delegate.DynamicInvoke() لاستدعاء وظيفة تأخذ ملف MyDateTime المعلمة ، ونوع الوسيطة التي أعبرها DynamicInvoke طويل.

هل كانت مفيدة؟

المحلول

هل انا صائب؟

اجل اجل انت. لكي تكون nit-picky ، يجب أن تقول "التحويل الضمني المعرفة من قبل المستخدم" بدلاً من "الممثل الضمني"-الممثلون (تقريبًا) صريح دائمًا. لكن خصمك الذي يحمل دقة التحميل الزائد يختار التحويل المعرفة من قبل المستخدم للاتصال به في وقت الترجمة و لا في وقت التشغيل صحيح.

هل هناك طريقة أخرى للقيام بذلك؟

نعم. في C# 4 إذا قمت بكتابة "كائنك" على أنه "ديناميكي" ، فإننا نبدأ التحويل البرمجي مرة أخرى في وقت التشغيل وإعادة أداء جميع التحليلات على المعاملات كما لو كانت أنواع وقت الترجمة هي أنواع وقت التشغيل الحالية. كما قد تتخيل ، هذا ليس رخيصًا ، على الرغم من أننا أذكياء للغاية بشأن التخزين المؤقت وإعادة استخدام النتائج إذا قمت بذلك في حلقة ضيقة.

نصائح أخرى

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

long f = 5;
object g = f;
MyDateTime h = g as MyDateTime;

يجب أن تعمل إضافة عامل صريح: http://msdn.microsoft.com/en-us/library/85w54y0a(vs.80).aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top