ميزة المترجم C أو هل أفقد عقلي؟
-
29-09-2019 - |
سؤال
بعد إعادة كتابة وظيفة استدعاء الحدث الخاصة بي للتعامل مع الأحداث وحججها بشكل عام ، بدأت في تجاوز الكود الخاص بي (لمطابقة التغيير) ، ولاحظت أن المترجم أجرى ضمنيًا المكالمة العامة.
ها هي وظيفتي:
private void InvokeEvent<TArgs>(EventHandler<TArgs> invokedevent, TArgs args)
where TArgs : EventArgs
{
EventHandler<TArgs> temp = invokedevent;
if (temp != null)
{
temp(this, args);
}
}
وهنا هو السطر لاستدعاء الوظيفة:
InvokeEvent(AfterInteraction, result);
هذا يجمع دون مشكلة ، وحتى يعرض Intellisense المكالمة "الصحيحة" (مع الجزء).
هل هذه ميزة برنامج التحويل البرمجي (يمكن استنتاج النوع العام ، في الواقع ، مباشرة من الوسيطة الثانية) ، أو هل سأجنون شيئًا وأفتقد هذه النقطة؟
المحلول
إذا تمكن المترجم في هذه الحالة يمكن أن يستنتج TArgs
من المعلمة الثانية.
ولكن إذا لم يستطع الاستنتاج الكل اكتب المعلمات ، تحتاج إلى تحديدها جميعًا ، حتى تلك التي يمكن أن يستنتجها المترجم.
نصائح أخرى
إنه استنتاج نوع المكالمة ، اقرأ عنه هنا, ، ابحث عن الفصل "الاستدلال"
كما قلت أن المترجم قد استنتج من النوع من الحجة الثانية.