জেনারিক্সে <আউট টি> বনাম <টি>


188

মধ্যে পার্থক্য কি <out T>এবং <T>? উদাহরণ স্বরূপ:

public interface IExample<out T>
{
    ...
}

বনাম

public interface IExample<T>
{
    ...
}

1
ভাল উদাহরণটি হবে IObservable <T> এবং IObserver <T>, এমএসসিআরলিবায় সিস্টেম এনএসে সংজ্ঞায়িত। পাবলিক ইন্টারফেস IObservable <আউট টি>, এবং সার্বজনীন ইন্টারফেস IObserver <টি>>। একইভাবে, আইনিমরেটর <আউট টি>, অনুমিত <আউট টি>
বিবেকদেব

1
আমি সবচেয়ে ভাল ব্যাখ্যার সাথে দেখা করেছি: agirlamonggeeks.com/2019/05/29/… । (<টি> <- এর অর্থ টি কেবল কোনও পদ্ধতির পরামিতি হিসাবে উত্তীর্ণ হতে পারে; <আউট টি> <- এর অর্থ টি হতে পারে কেবল পদ্ধতির ফলাফল হিসাবে ফিরে এসেছেন)
উলাদজিমির শরয়ি

উত্তর:


210

outজেনেরিক্স মধ্যে শব্দ বোঝাতে যে ইন্টারফেস টাইপ টি covariant ব্যবহৃত হয়। বিশদের জন্য সমবায়তা এবং বৈপরীত্য দেখুন ।

ক্লাসিক উদাহরণটি হ'ল IEnumerable<out T>। যেহেতু IEnumerable<out T>কোভারিয়েন্ট, আপনাকে নিম্নলিখিতগুলি করার অনুমতি দেওয়া হয়েছে:

IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;

উপরের দ্বিতীয় লাইনটি যদি সমবায় না হয় তবে ব্যর্থ হবে যদিও যৌক্তিকভাবে এটির কাজ করা উচিত, যেহেতু স্ট্রিংটি বস্তু থেকে উদ্ভূত হয়েছিল। জেনেরিক ইন্টারফেসের প্রকরণটি সি # এবং ভিবি.এনইটিতে যুক্ত হওয়ার আগে (ভিএস 2010 এর সাথে .NET 4 এ) যোগ করার আগে এটি একটি সংকলন সময় ত্রুটি ছিল।

.NET 4 এর পরে সমবায়িক IEnumerable<T>হিসাবে চিহ্নিত হয়েছিল এবং হয়ে ওঠে IEnumerable<out T>। যেহেতু IEnumerable<out T>কেবলমাত্র এর মধ্যে থাকা উপাদানগুলি ব্যবহার করে এবং এগুলি কখনই যুক্ত / পরিবর্তন করে না, তার পক্ষে স্ট্রিংয়ের একটি বিশাল সংখ্যার অবজেক্টের সংখ্যার সংগ্রহ হিসাবে গণ্য করা নিরাপদ, যার অর্থ এটি সমবায়িক

এটি IList<T>যেহেতু একটি ধরণের সাথে কাজ করে না , কারণ IList<T>একটি Addপদ্ধতি রয়েছে। মনে করুন এটি অনুমোদিত হবে:

IList<string> strings = new List<string>();
IList<object> objects = strings;  // NOTE: Fails at compile time

আপনি তখন কল করতে পারেন:

objects.Add(new Image()); // This should work, since IList<object> should let us add **any** object

এটি অবশ্যই ব্যর্থ হবে - সুতরাং IList<T>সমবায়িক হিসাবে চিহ্নিত করা যায় না।

বিটিডব্লিউ, এর জন্য একটি বিকল্প রয়েছে in- যা তুলনা ইন্টারফেসের মতো জিনিস দ্বারা ব্যবহৃত হয়। IComparer<in T>উদাহরণস্বরূপ, বিপরীত পথে কাজ করে। আপনি যদি একটি কংক্রিটকে IComparer<Foo>সরাসরি হিসাবে ব্যবহার করতে পারেন IComparer<Bar>তবে Barএটি একটি সাবক্লাস Foo, কারণ IComparer<in T>ইন্টারফেসটি বিপরীত


4
@ কোল জনসন কারণ Imageএকটি বিমূর্ত শ্রেণি;) আপনি new List<object>() { Image.FromFile("test.jpg") };কোনও সমস্যা ছাড়াই করতে পারেন, বা আপনিও করতে পারেন new List<object>() { new Bitmap("test.jpg") };। আপনার সমস্যাটি হ'ল এটি new Image()অনুমোদিত নয় (আপনি var img = new Image();
এটিও

4
জেনেরিক IList<object>একটি উদ্ভট উদাহরণ, আপনি যদি চান তবে আপনার objectজেনেরিকের দরকার নেই।
Jodrell

5
@ রিডকপসি আপনি নিজের মন্তব্যে নিজের উত্তরটির বিরোধিতা করছেন না?
মারিওডিএস

64

কীওয়ার্ডের সহজে ব্যবহার inএবং out(স্বার্থান্বেষ এবং বিপরীতে) স্মরণ করার জন্য , আমরা উত্তরাধিকারকে মোড়ক হিসাবে চিত্র করতে পারি:

String : Object
Bar : Foo

ইন / আউট


11
এটি কি ভুল উপায়ে নয়? কনট্র্যাভারিয়েন্স = ইন = আরও উত্পন্ন স্থানের জায়গায় কম উদ্ভূত প্রকার ব্যবহার করার অনুমতি দেয়। / কোভেরিয়েন্স = আউট = কম উদ্ভূত স্থানে আরও উদ্ভূত প্রকার ব্যবহার করার অনুমতি দেয়। ব্যক্তিগতভাবে, আপনার চিত্রটি দেখে আমি এটির বিপরীতে পড়েছি।
স্যাম শাইলস

co u বৈকল্পিক (: আমার জন্য
snur

49

বিবেচনা,

class Fruit {}

class Banana : Fruit {}

interface ICovariantSkinned<out T> {}

interface ISkinned<T> {}

এবং কার্যাদি,

void Peel(ISkinned<Fruit> skinned) { }

void Peel(ICovariantSkinned<Fruit> skinned) { }

যে ফাংশনটি গ্রহণ করে তা গ্রহণ ICovariantSkinned<Fruit>করতে সক্ষম হবে ICovariantSkinned<Fruit>বা ICovariantSkinned<Bananna>কারণ ICovariantSkinned<T>এটি একটি কোভেরিয়েন্ট ইন্টারফেস এবং Bananaএটি এক ধরণের Fruit,

গ্রহণযোগ্য ফাংশনটি ISkinned<Fruit>কেবল গ্রহণ করতে সক্ষম হবে ISkinned<Fruit>


37

" out T" এর অর্থ Tহ'ল "সমবায়" type যা Tজেনেরিক শ্রেণি, ইন্টারফেস বা পদ্ধতির পদ্ধতিতে কেবলমাত্র ফেরত (আউটবাউন্ড) মান হিসাবে উপস্থিত হতে সীমাবদ্ধ করে। প্রভাবটি হ'ল আপনি টাইপ / ইন্টারফেস / পদ্ধতিটিকে একটি সুপার-টাইপের সমতুল্য castালাই করতে পারেন T
যেমন ICovariant<out Dog>নিক্ষেপ করা যেতে পারে ICovariant<Animal>


13
আমি এই উত্তরটি না পড়া পর্যন্ত আমি বুঝতে পারি নি যে কেবল outপ্রয়োগ করা Tযেতে পারে be পুরো ধারণাটি এখন আরও সার্থক করে তোলে!
মারিওডিএস

6

আপনার পোস্ট করা লিঙ্কটি থেকে ....

জেনেরিক ধরণের পরামিতিগুলির জন্য, আউট কীওয়ার্ডটি নির্দিষ্ট করে যে প্রকারের প্যারামিটারটি কোভেরিয়েন্ট

সম্পাদনা : আবার, আপনার পোস্ট করা লিঙ্কটি থেকে

আরও তথ্যের জন্য, কোভেরিয়েন্স এবং কনট্রাভারিয়েন্স (সি # এবং ভিজ্যুয়াল বেসিক) দেখুন। http://msdn.microsoft.com/en-us/library/ee207183.aspx

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