سؤال

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

هنا مثال:

public class Foo<T> where T : IBar
{
    private readonly T instance;

    public Foo(T instance)
    {
        this.instance = instance;
    }
    public T Instance
    {
        get { return instance; }
    }
    public static implicit operator Foo<T>(T instance)
    {
        return new Foo<T>(instance);
    }
}

رمز لاستخدامه:

var concreteReferenceToBar = new ConcreteBar();
IBar intefaceReferenceToBar = concreteReferenceToBar;
Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work

لا أحد يعرف الحل او يمكن لأي شخص أن يشرح بطريقة مرضية لماذا أنا shuouldn لا تكون قادرة على الزهر interfaceReferenceToBar ضمنا إلى Foo<IBar>, لأن في حال لم يتم تحويلها ، ولكن فقط الواردة في فو?

تحرير: يبدو التغاير قد تقدم الخلاص.دعونا نأمل C# 4.0 مواصفات يسمح ضمنيا الصب من أنواع الواجهات باستخدام التغاير.

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

المحلول

السبب لا يمكنك أن تفعل هذا لأنها محرمة تحديدا في لغة C# المواصفات:

فئة أو البنية يسمح تعلن التحويل من مصدر نوع S إلى هدف نوع T توفير جميع التالية صحيحا:

  • ...
  • لا S أو T object أو واجهة نوع.

و

المعرفة من قبل المستخدم التحويلات لا يسمح تحويل من أو إلى واجهة-أنواع.على وجه الخصوص ، تقييد يضمن أن لا المعرفة من قبل المستخدم التحولات تحدث عند تحويل إلى واجهة نوع, وأن التحويل إلى واجهة نوع ينجح إلا إذا كان كائن يتم تحويلها فعلا تنفذ المحدد واجهة نوع.

المصدر

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