মধ্যে পার্থক্য কি <out T>
এবং <T>
? উদাহরণ স্বরূপ:
public interface IExample<out T>
{
...
}
বনাম
public interface IExample<T>
{
...
}
মধ্যে পার্থক্য কি <out T>
এবং <T>
? উদাহরণ স্বরূপ:
public interface IExample<out T>
{
...
}
বনাম
public interface IExample<T>
{
...
}
উত্তর:
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>
ইন্টারফেসটি বিপরীত ।
Image
একটি বিমূর্ত শ্রেণি;) আপনি new List<object>() { Image.FromFile("test.jpg") };
কোনও সমস্যা ছাড়াই করতে পারেন, বা আপনিও করতে পারেন new List<object>() { new Bitmap("test.jpg") };
। আপনার সমস্যাটি হ'ল এটি new Image()
অনুমোদিত নয় (আপনি var img = new Image();
IList<object>
একটি উদ্ভট উদাহরণ, আপনি যদি চান তবে আপনার object
জেনেরিকের দরকার নেই।
কীওয়ার্ডের সহজে ব্যবহার in
এবং out
(স্বার্থান্বেষ এবং বিপরীতে) স্মরণ করার জন্য , আমরা উত্তরাধিকারকে মোড়ক হিসাবে চিত্র করতে পারি:
String : Object
Bar : Foo
বিবেচনা,
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>
।
" out T
" এর অর্থ T
হ'ল "সমবায়" type যা T
জেনেরিক শ্রেণি, ইন্টারফেস বা পদ্ধতির পদ্ধতিতে কেবলমাত্র ফেরত (আউটবাউন্ড) মান হিসাবে উপস্থিত হতে সীমাবদ্ধ করে। প্রভাবটি হ'ল আপনি টাইপ / ইন্টারফেস / পদ্ধতিটিকে একটি সুপার-টাইপের সমতুল্য castালাই করতে পারেন T
।
যেমন ICovariant<out Dog>
নিক্ষেপ করা যেতে পারে ICovariant<Animal>
।
out
প্রয়োগ করা T
যেতে পারে be পুরো ধারণাটি এখন আরও সার্থক করে তোলে!
আপনার পোস্ট করা লিঙ্কটি থেকে ....
জেনেরিক ধরণের পরামিতিগুলির জন্য, আউট কীওয়ার্ডটি নির্দিষ্ট করে যে প্রকারের প্যারামিটারটি কোভেরিয়েন্ট ।
সম্পাদনা : আবার, আপনার পোস্ট করা লিঙ্কটি থেকে
আরও তথ্যের জন্য, কোভেরিয়েন্স এবং কনট্রাভারিয়েন্স (সি # এবং ভিজ্যুয়াল বেসিক) দেখুন। http://msdn.microsoft.com/en-us/library/ee207183.aspx