বৈকল্পিকতা কেবলমাত্র নিরাপদ উপায়ে সমর্থিত হবে - বাস্তবে, সিএলআর ইতিমধ্যে রয়েছে এমন ক্ষমতাগুলি ব্যবহার করে। সুতরাং আমি (এবং যা কিছু ছিল) List<Banana>
হিসাবে ব্যবহার করার চেষ্টা করার বইটিতে যে উদাহরণগুলি দিয়েছি List<Fruit>
তা এখনও কার্যকর হবে না - তবে কয়েকটি অন্যান্য পরিস্থিতি এটি করবে।
প্রথমত, এটি কেবল ইন্টারফেস এবং প্রতিনিধিদের জন্য সমর্থনযোগ্য।
দ্বিতীয়ত, এর জন্য ইন্টারফেস / প্রতিনিধি লেখকের প্রয়োজন হয় in
(বিপরীতে) বা out
( সম্প্রদায়ের জন্য) প্রকারের প্যারামিটারগুলি সাজাতে । সর্বাধিক সুস্পষ্ট উদাহরণ IEnumerable<T>
যা আপনাকে সর্বদা তার "মান" বের করতে দেয় - এটি আপনাকে নতুন কোনও যোগ করতে দেয় না। তা হয়ে যাবে IEnumerable<out T>
। এটি প্রকারের সুরক্ষাকে মোটেই ক্ষতি করে না, তবে উদাহরণ হিসাবে IEnumerable<string>
ফিরে আসার IEnumerable<object>
জন্য ঘোষিত একটি পদ্ধতি থেকে আপনাকে একটি ফিরিয়ে দেয় ।
ইন্টারফেস ব্যবহারের জন্য কন্ট্রাকভারিয়েন্সের পক্ষে দৃ give় উদাহরণ দেওয়া আরও শক্ত, তবে একটি প্রতিনিধি দ্বারা এটি সহজ। বিবেচনা করুন Action<T>
- এটি কেবলমাত্র এমন একটি পদ্ধতির প্রতিনিধিত্ব করে যা T
পরামিতি নেয় । এটি নির্বিঘ্নে একটি Action<object>
হিসাবে রূপান্তর করতে সক্ষম হওয়াই ভাল হবে Action<string>
- কোনও object
পরামিতি লাগে যে কোনও পদ্ধতি এটি string
পরিবর্তে উপস্থাপন করা হলে ভাল হতে চলেছে । অবশ্যই, সি # 2 এর মধ্যে কিছুটা হলেও প্রতিনিধিদের স্ববিরোধ ও বৈপরীত্য রয়েছে, তবে একটি প্রতিনিধি থেকে অন্য রূপের প্রকৃত রূপান্তরের মাধ্যমে (একটি নতুন উদাহরণ তৈরি করা হচ্ছে) - উদাহরণগুলির জন্য P141-144 দেখুন। সি # 4 এটি আরও জেনেরিক করে তুলবে এবং (আমি বিশ্বাস করি) রূপান্তরটির জন্য একটি নতুন উদাহরণ তৈরি করা এড়াতে পারবে। (পরিবর্তে এটি একটি রেফারেন্স রূপান্তর হবে))
আশা করি এটি কিছুটা সাফ হয়ে যায় - দয়া করে এটি জানাতে না পারলে দয়া করে আমাকে জানান!