আমি অ্যান্টনি পেগ্রামের উত্তরটি পরিষ্কার করার চেষ্টা করব।
যখন বলা ধরনের মান (যেমন ফেরৎ জেনেরিক টাইপ কিছু টাইপ যুক্তি উপর covariant হয় Func<out TResult>আয় দৃষ্টান্ত TResult, IEnumerable<out T>আয় দৃষ্টান্ত T)। অর্থাৎ কিছু আয় দৃষ্টান্ত যদি TDerived, আপনি ভাল হিসাবে যেমন দৃষ্টান্ত সাথে কাজ করতে পারেন, যেন তারা ছিল TBase।
জেনেরিক টাইপটি কোনও ধরণের আর্গুমেন্টের তুলনায় বিপরীত হয় যখন এটি উল্লিখিত প্রকারের মানগুলি গ্রহণ করে (যেমন উদাহরণ Action<in TArgument>স্বীকার করে TArgument)। এটি হ'ল, যদি কোনও কিছুর উদাহরণ প্রয়োজন হয় তবে TBaseআপনি উদাহরণস্বরূপ পাসও করতে পারেন TDerived।
এটি বেশ যৌক্তিক বলে মনে হয় যে জেনেরিক প্রকার যা উভয়ই কিছু প্রকারের দৃষ্টান্ত গ্রহণ করে এবং ফেরত দেয় (যদি না এটি জেনেরিক ধরণের স্বাক্ষরে দু'বার সংজ্ঞায়িত করা হয় CoolList<TIn, TOut>) তবে এগুলি সম্পর্কিত ধরণের যুক্তিতে কোভারিয়েন্ট বা বিপরীত নয়। উদাহরণস্বরূপ ,। Listনেট 4 হিসাবে সংজ্ঞায়িত করা হয়েছে List<T>, না List<in T>বা নয় List<out T>।
কিছু সামঞ্জস্যের কারণে মাইক্রোসফ্ট সেই যুক্তিটিকে উপেক্ষা করতে এবং তাদের মান টাইপ যুক্তির উপর অ্যারেটি কোভারিয়েন্ট তৈরি করতে পারে। হতে পারে তারা একটি বিশ্লেষণ চালিয়ে গিয়ে দেখা গেছে যে বেশিরভাগ লোকেরা কেবল অ্যারে ব্যবহার করে যেমন তারা কেবলমাত্র পঠনযোগ্য (অর্থাৎ তারা কেবল অ্যারেতে কিছু ডেটা লেখার জন্য অ্যারে প্রারম্ভকারী ব্যবহার করে) এবং যেমন সুবিধাগুলি সম্ভাব্য রানটাইম দ্বারা সৃষ্ট অসুবিধাগুলি ছাড়িয়ে যায় ত্রুটিগুলি যখন অ্যারেতে লেখার সময় কেউ কেউ covariance ব্যবহার করার চেষ্টা করবে। সুতরাং এটি অনুমোদিত তবে উত্সাহিত নয়।
আপনার মূল প্রশ্ন হিসাবে, মূল তালিকা থেকে অনুলিপি করা মানগুলি সহ list.ToArray()একটি নতুন তৈরি করে LinkLabel[]এবং (যুক্তিসঙ্গত) সতর্কতা থেকে মুক্তি পেতে আপনাকে প্রবেশ Control[]করতে হবে AddRange। list.ToArray<Control>()কাজটি করবে: তার যুক্তি হিসাবে ToArray<TSource>গ্রহণ IEnumerable<TSource>করে এবং প্রত্যাবর্তন করে TSource[]; List<LinkLabel>কেবল পঠনযোগ্য প্রয়োগ করে IEnumerable<out LinkLabel>, যা IEnumerableসর্বগ্রহকে ধন্যবাদ , IEnumerable<Control>তার যুক্তি হিসাবে গ্রহণ পদ্ধতিতে পাস করা যেতে পারে ।
LinkLabel(বিশেষায়িত টাইপ) থেকেControl(বেস টাইপ) যাচ্ছি ।