জেনেরিক কোভারিয়েন্স এবং কনট্রা-ভেরিয়েন্সটি সি # 4.0 এ কীভাবে প্রয়োগ করা হয়?


106

আমি পিডিসি ২০০৮ এ উপস্থিত ছিলাম না, তবে আমি কিছু সংবাদ শুনেছি যে জেনেরিক কোভেরিয়েন্স এবং বৈপরীত্যকে সমর্থন করার জন্য সি # 4.0 ঘোষণা করা হয়েছে। যে, List<string>নিযুক্ত করা যেতে পারে List<object>। এটা কিভাবে হতে পারে?

জন স্কিটির বই সি # ইন ডিপথ-এ , কেন ব্যাখ্যা করা হয়েছে যে কেন সি # জেনারিকস সমাগম এবং বিপরীত পরিবর্তনের পক্ষে সমর্থন করে না। এটি মূলত সুরক্ষিত কোড লেখার জন্য। এখন, তাদের সমর্থন করার জন্য সি # 4.0 পরিবর্তন হয়েছে। এটা বিশৃঙ্খলা আনতে হবে?

সি # ৪.০ সম্পর্কে যে কেউ বিশদ জানাতে পারে তার কিছু ব্যাখ্যা দিতে পারে?


এখানে একটি ভাল নিবন্ধ যা সি # 4.0-তে প্রতিনিধি এবং ইন্টারফেসগুলিতে আসন্ন সম্প্রচার এবং বৈসাদৃশ্য
সিএমএস

অ্যান্ডার্স নরসে সি # ৪.৪- তে ব্যাখ্যা করেছেন - কোভরিয়েন্স এবং কনট্রাস্ট-ভেরিয়েন্স ধারণাটি এবং দেখায় যে, এটি নেট .০.০ থেকে যেহেতু এটি আজই আইএল-তে সমর্থনযোগ্য।
থমাস ফ্রয়েডেনবার্গ

উত্তর:


155

বৈকল্পিকতা কেবলমাত্র নিরাপদ উপায়ে সমর্থিত হবে - বাস্তবে, সিএলআর ইতিমধ্যে রয়েছে এমন ক্ষমতাগুলি ব্যবহার করে। সুতরাং আমি (এবং যা কিছু ছিল) 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 এটি আরও জেনেরিক করে তুলবে এবং (আমি বিশ্বাস করি) রূপান্তরটির জন্য একটি নতুন উদাহরণ তৈরি করা এড়াতে পারবে। (পরিবর্তে এটি একটি রেফারেন্স রূপান্তর হবে))

আশা করি এটি কিছুটা সাফ হয়ে যায় - দয়া করে এটি জানাতে না পারলে দয়া করে আমাকে জানান!


3
সুতরাং, এর অর্থ কি এই যদি শ্রেণিটিকে "তালিকা <আউট টি>" হিসাবে ঘোষণা করা হয় তবে এর "সদস্যহীন অ্যাড (টি আপত্তি)" এর মতো সদস্যের ফাংশন থাকা উচিত নয়? সি # 4.0 সংকলক ত্রুটিটি রিপোর্ট করবে, তাই না?
মরগান চেং

1
মরগান: হ্যাঁ, এটি অবশ্যই আমার বোঝার।
জন স্কিটি

4
তবুও এখানে আপনার উত্তরগুলির মধ্যে একটিতে এসও এর সাথে সাথে আমাকে কিছু কোড উন্নত করতে সহায়তা করেছে। ধন্যবাদ!
চিহ্নিত করুন

@ অর্ক-কুন: হ্যাঁ, আমি এটি সম্পর্কে অবহিত। সুতরাং একই বাক্যে "এখনও কাজ করবে না"। (এবং আমি এর কারণগুলি সম্পর্কেও অবগত রয়েছি))
জন স্কিটি

@ জোনস্কিট কি ঠিক আছে যে @ অর্ক -কুন যেমন বলেছিলেন "আপনি কেবলমাত্র List<Banana>হিসাবে হিসাবে ব্যবহার করতে পারেন IList<Fruit>"? যদি তা হয় তবে এটি কীভাবে সম্ভব, যদিও IList<T>ইন্টারফেসের টাইপ প্যারামিটারটি কোভারিয়েন্ট হিসাবে সংজ্ঞায়িত করা হয়নি (না out T, তবে সহজভাবে T)।
গেহহো

5

জোন ইতিমধ্যে এটি কভার করেনি তা নয়, তবে এরিক লিপার্টের ব্লগ এবং ভিডিওগুলির কয়েকটি লিঙ্ক এখানে রয়েছে। তিনি উদাহরণ সহ এটি ব্যাখ্যা করার একটি দুর্দান্ত কাজ করেন।

https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/

ভিডিওগুলি:

https://www.youtube.com/watch?v=3MQDrKbzvqU

https://www.youtube.com/watch?v=XRIadQaBYlI

https://www.youtube.com/watch?v=St9d2EDZfrg

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.