c# - List of Interfaces vs. List of Derived Type - Cannot Convert Expression Type to Return Type -
यह क्यों काम करता है:
सार्वजनिक IList & lt; ICoupon & gt; GetCouponsForSite (स्ट्रिंग साइटस्लाग) {var कूपन = _db.Coupons.Where (x = & gt; x.Site.slug == siteSlug)। चुनें (x = & gt; नया कूपन (x.id)); Var सूची = नई सूची & lt; ICoupon & gt; (); विदेशी मुद्रा (कूपन में विभिन्न कूपन) {list.Add (कूपन); } वापसी सूची; }
लेकिन यह काम नहीं करता है (त्रुटि - प्रकार वापस जाने के लिए अभिव्यक्ति प्रकार परिवर्तित नहीं कर सकते):
सार्वजनिक IList & LT; ICoupon & gt; GetCouponsForSite (स्ट्रिंग साइटस्लाग) {वापसी _db.Coupons.Where (x = & gt; x.Site.slug == siteSlug)। चयन करें (x = & new ;;;;;;;;;; x; नया कूपन (x.id))। ToList (); }
क्योंकि db.Coupons ... ToList () एक लौटता है & lt ;
आईआईएलआईटी & lt; ICoupon & gt;
के बजाय; कूपन & gt; IList & lt; कूपन & gt;
IList & lt; ICoupon & gt;
से प्राप्त नहीं करता है क्योंकि C # 3 सामान्य विचरण का समर्थन नहीं करता है यह अभी भी इस मामले में प्राप्त नहीं होगा (सी # 4 सामान्य विचरण का समर्थन करता है, लेकिन विचार करें जो कोई भी एक IList है & lt प्राप्त करता है कि;। ICoupon & gt;।
इसे में एक SomeEvilTypeThatImplementsICoupon सामान के लिए कोशिश कर सकते लेकिन एक IList है & lt ; कूपन & gt;।।
स्वीकार नहीं कर सका क्योंकि SomeEvilTypeThatImplementsICoupon कूपन से निकाले जाते हैं नहीं है इस परिवर्तनीयता मुद्दे की चर्चा के लिए देखें यद्यपि एक अलग संदर्भ में, और एरिक लिप्पर्ट लेख वहाँ से जुड़े)
सूची से & lt निर्माण करती है। अब अगर रिसीवर इसे में SomeEvilTypeThatImplementsICoupon प्रहार करने के लिए फैसला करता है, सब कुछ ठीक है, क्योंकि सूची किसी भी ICoupon ही नहीं, वास्तविक कूपन वस्तुओं धारण करने के लिए बनाया गया था।)
Comments
Post a Comment