নীচের সি # কোড কেন সংকলন করছে না তা আমি বুঝতে পারি না।
আপনি দেখতে পাচ্ছেন, আমার কাছে একটি স্ট্যাটিক জেনেরিক পদ্ধতি রয়েছে একটি IEnumerable<T>
প্যারামিটার সহ কিছু (এবং T
এটি একটি IA
ইন্টারফেস হতে বাধ্য হয় ), এবং এই পরামিতিটি স্পষ্টত রূপান্তরিত হতে পারে না IEnumerable<IA>
।
এর ব্যাখ্যা কী? (আমি কোনও কাজের জন্য অনুসন্ধান করি না, কেবল এটি কেন কাজ করে না তা বোঝার জন্য)।
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
আমি Something2(bar)
লাইন পেতে ত্রুটি :
আর্গুমেন্ট 1: 'সিস্টেম.কলেশনস.জেনারিক.লিস্ট' থেকে 'সিস্টেম.কলেশনস.জেনারিক.আইইনুমারেবল' তে রূপান্তর করতে পারে না
T
রেফারেন্স প্রকারের মধ্যে সীমাবদ্ধ করেননি । আপনি যদি শর্তটি ব্যবহার করেন where T: class, IA
তবে এটি কাজ করা উচিত। লিঙ্কযুক্ত উত্তরে আরও বিশদ রয়েছে।
Something2(foo);
সরাসরি সরাসরি বলে পরিস্থিতি পুনরুত্পাদন করতে পারেন । ( জেনেরিক পদ্ধতিতে আপনার টাইপ প্যারামিটারটি ঘোষিত) .ToList()
পেতে কাছাকাছি যাওয়া ( এটিকে একটি ) বোঝার দরকার নেই । List<T>
T
List<T>
IEnumerable<T>