سؤال

دعونا نحصل على مثال التالي:

public class X { }
public class Y { }
public class Z { }

public delegate IDictionary<Y, IList<Z>> Bar(IList<X> x, int i);

public interface IFoo
{
    // ...
    Bar Bar { get; }
}

public class Foo : IFoo
{
    // ...
    public Bar Bar
    {
        get
        {
            return null; //...
        }
    }
}

void Main()
{
    IFoo foo; //= ...
    IEnumerable<IList<X>> source; //= ...
    var results = source.Select(foo.Bar); // <- compile error here
}

يقول المترجم:

لا يمكن استنتاج نوع الوسائط الخاصة بـ method 'system.linq.enumerable.select (system.collections.generic.ienumerable ، system.func) "من الاستخدام. حاول تحديد وسيطات النوع بشكل صريح.

إنه لأنه لا يمكن تحويله Bar ل Func<IList<X>, int, IDictionary<Y, IList<Z>>>.

سيكون من الرائع أن أتمكن من إنشاء أسماء مستعارة من نوع المساحة الناطمية للأنواع العامة في C#. ثم أود تحديد Bar ليس كمندوب ، بل أود أن أعرّفه على أنه اسم مستعار للمساحة Func<IList<X>, int, IDictionary<Y, IList<Z>>>.

public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;

يمكنني بعد ذلك تحديد اسم المستعة المسموح بها في مساحة الاسم على سبيل المثال IDictionary<Y, IList<Z>>.

وإذا تم استخدامه بشكل مناسب :) ، فإنه سيجعل الكود أكثر قابلية للقراءة. الآن ، يجب أن أضمن الأنواع العامة والرمز الحقيقي غير قابل للقراءة جيدًا :(

هل وجدت نفس المشكلة :)؟ هل هناك أي سبب وجيه لعدم وجوده في C# 3.0؟ أو لا يوجد سبب وجيه ، إنها مجرد أموال و/أو وقت؟

تحرير: أعلم أنه يمكنني استخدام using, ، لكنها ليست مساحة مسافة - ليست مريحة للغاية لحالتي.

EDIT2: انظر تعليق من قبل Joren حيث يقترح أن الكتابة الهيكلية قد تحل المشكلة أيضًا.

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

المحلول

ليس لديك اي حظ؛ يؤثر التوجيه باستخدام ملفه الحالي فقط. لا توجد آلية الاسم المستعارة على مستوى مساحة الاسم.

هذه ميزة مطلوبة إلى حد ما ، وهي نقاط لذلك. ولكن من المهم أيضًا ميزة "من الجيد أن يكون لديك" بدلاً من تلك التي تضيف حقًا الكثير من القوة التمثيلية إلى اللغة ، وهي نقاط ضدها. سيكون من الجيد القيام بذلك ، لكنها ليست عالية حقًا في قائمة الأولوية.

نصائح أخرى

اذا فعلت ...

var results = source.Select((x, i) => foo.Bar(x, i));

يمكن أن يكتشف الأنواع لك دون الحاجة إلى تحديدها بشكل صريح.

(من المسلم به أن هذا هو العمل أكثر من حل)

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