তালিকা <টি> একটি শ্রেণি এবং আইকোলিকেশন <টি> এবং আইনিউমেন্টেবল <T> ইন্টারফেস উভয়ই প্রয়োগ করে । এছাড়াও, আইকোলিকেশন <T> IEnumerable <T> ইন্টারফেস প্রসারিত করে। এগুলি বিনিময়যোগ্য নয়, অন্তত সমস্ত দৃষ্টিকোণ থেকে নয়।
আপনার যদি একটি তালিকা <টি> থাকে তবে আপনাকে গ্যারান্টি দেওয়া হয় যে এই অবজেক্টটি আইকোলিকেশন <T> এবং আইনিউমেবল <T> ইন্টারফেসের দ্বারা প্রয়োগ করার জন্য প্রয়োজনীয় পদ্ধতি এবং বৈশিষ্ট্যগুলি প্রয়োগ করে। সংকলক এটি জানে এবং আপনাকে এগুলিকে একটি আইকোলিকেশন <T> বা একটি অনুমেয় <t> অন্তর্নিহিতভাবে "ডাউন" করার অনুমতি দেয় to তবে, যদি আপনার কোনও আইকোলিকেশন থাকে <T> আপনার কোডটিতে আগে itালার আগে আপনার কোডটি প্রথমে আপনার তালিকাতে পরীক্ষা করতে হবে এটি তালিকা <T> বা অন্য কিছু, সম্ভবত একটি অভিধান <T> (যেখানে টি একটি কীভ্যালিউপায়ার রয়েছে ) তা cast ইচ্ছা.
আপনি জানেন যে আইকোলিকেশনটি আইমনামেবলকে প্রসারিত করে, তাই আপনি এটিকে একটি IEnumerable এ ফেলে দিতে পারেন। তবে আপনার যদি কেবল একটি অনুমিত হয় তবে আবার আপনার গ্যারান্টি নেই যে এটি একটি তালিকা। এটি হতে পারে তবে এটি অন্যরকম কিছু হতে পারে। উদাহরণস্বরূপ আপনি যদি কোনও অভিধান <টি> অভিধানে একটি তালিকা কাস্ট করার চেষ্টা করেন তবে আপনার একটি অবৈধ কাস্ট ব্যতিক্রম আশা করা উচিত।
সুতরাং তারা "বিনিময়যোগ্য" নয়।
এছাড়াও, প্রচুর জেনেরিক ইন্টারফেস রয়েছে, আপনি সিস্টেম.কলেশনগুলি.জেনেরিক নেমস্পেসে কী পেতে পারেন তা পরীক্ষা করে দেখুন ।
সম্পাদনা করুন: আপনার মন্তব্য সম্পর্কিত, আপনি যদি তালিকা <T> বা এটি প্রয়োগ করে এমন একটি ইন্টারফেস ব্যবহার করেন তবে একেবারে পারফরম্যান্সের জরিমানা নেই। আপনার এখনও একটি নতুন অবজেক্ট তৈরি করতে হবে, নিম্নলিখিত কোডটি দেখুন:
List<T> list = new List<T>();
ICollection<T> myColl = list;
IEnumerable<T> myEnum = list;
তালিকা , মাই কল এবং মাইএনম একই বস্তুতে নির্দেশ করে। আপনি এটিকে তালিকা বা আইকোলিকেশন হিসাবে ঘোষণা করুন বা একটি আইওনামেবল আমি এখনও একটি তালিকা তৈরির জন্য প্রোগ্রামটির প্রয়োজন। আমি এটি লিখতে পারে:
ICollection<T> myColl = new List<T>();
মাইকোল , রানটাইমে এখনও একটি তালিকা।
যাইহোক , এটি একটি সর্বাধিক গুরুত্বপূর্ণ বিষয় ... সংযুক্তি হ্রাস এবং রক্ষণাবেক্ষণ বাড়ানোর জন্য আপনার পক্ষে সর্বদা আপনার পক্ষে সম্ভব সর্বনিম্ন সম্ভাব্য সর্বনাম ব্যবহার করে আপনার পরিবর্তনশীল এবং পদ্ধতি পরামিতিগুলি ঘোষণা করা উচিত, তা সে ইন্টারফেস বা বিমূর্ত বা কংক্রিট শ্রেণীর হোক।
কল্পনা করুন যে "পারফরমফেরেশন" পদ্ধতির প্রয়োজন কেবলমাত্র উপাদানগুলির গণনা করা, কিছু কাজ করা এবং প্রস্থান করা, সেক্ষেত্রে আপনাকে তালিকা <T> এ উপলব্ধ আরও কয়েক শতাধিক পদ্ধতির প্রয়োজন নেই, আপনাকে কেবলমাত্র আইনিউমেন্টেবল <টিতে উপলভ্য যেগুলি প্রয়োজন >, সুতরাং নিম্নলিখিতগুলি প্রয়োগ করা উচিত:
public void PerformOperation(IEnumerable<T> myEnumeration) { ... }
এটি করে আপনি এবং অন্যান্য বিকাশকারীরা জানেন যে IEnumerable <T> ইন্টারফেস প্রয়োগকারী শ্রেণীর যে কোনও অবজেক্ট এই পদ্ধতিতে দেওয়া যেতে পারে। এটি কোনও তালিকা, একটি অভিধান বা অন্য বিকাশকারী কাস্টম সংগ্রহের শ্রেণি হতে পারে।
বিপরীতে যদি আপনি নির্দিষ্ট করে থাকেন তবে আপনার স্পষ্টভাবে একটি কংক্রিটের তালিকা প্রয়োজন <টি> (এবং যদিও এটি বাস্তব জীবনে খুব কমই ঘটেছিল, এটি এখনও ঘটতে পারে), আপনি এবং অন্যান্য বিকাশকারীরা জানেন যে এটি অবশ্যই তালিকা বা অন্য একটি কংক্রিট শ্রেণীর উত্তরাধিকারী হতে হবে তালিকা থেকে।