এই আচরণটি বুঝতে আপনার দুটি জিনিস জানতে হবে।
- সমস্ত প্রতিনিধি থেকে প্রাপ্ত
System.Delegate
, তবে বিভিন্ন প্রতিনিধিদের বিভিন্ন ধরণের থাকে এবং তাই একে অপরের জন্য বরাদ্দ করা যায় না।
- সি # ভাষা কোনও প্রতিনিধিকে কোনও পদ্ধতি বা ল্যাম্বডা নির্ধারণের জন্য বিশেষ হ্যান্ডলিং সরবরাহ করে ।
কারণ বিভিন্ন প্রতিনিধিদের বিভিন্ন প্রকার রয়েছে, এর অর্থ আপনি এক প্রকারের অন্য কোনও প্রতিনিধি নির্ধারণ করতে পারবেন না।
উদাহরণস্বরূপ, প্রদত্ত:
delegate void test1(int i);
delegate void test2(int i);
তারপর:
test1 a = Console.WriteLine; // Using special delegate initialisation handling.
test2 b = a; // Using normal assignment, therefore does not compile.
উপরের প্রথম লাইনটি ঠিকঠাক সঙ্কলন করেছে কারণ এটি কোনও ল্যাম্বডা বা একটি প্রতিনিধিকে কোনও পদ্ধতি নির্ধারণের জন্য বিশেষ হ্যান্ডলিং ব্যবহার করছে।
প্রকৃতপক্ষে, এই লাইনটি কম্পাইলার দ্বারা কার্যকরভাবে এর মতো আবারও লিখেছেন:
test1 a = new test1(Console.WriteLine);
উপরের দ্বিতীয় লাইনটি সংকলন করে না কারণ এটি অন্য ধরণের বেমানান প্রকারকে এক ধরণের উদাহরণ দেওয়ার চেষ্টা করছে।
প্রকারভেদে যতদূর যায়, তার মধ্যে কোনও সামঞ্জস্যপূর্ণ অ্যাসাইনমেন্ট নেই test1
এবং test2
কারণ এগুলি বিভিন্ন ধরণের।
এটি যদি এটি সম্পর্কে ভাবতে সহায়তা করে তবে এই শ্রেণীর শ্রেণিবিন্যাসটি বিবেচনা করুন:
class Base
{
}
class Test1 : Base
{
}
class Test2 : Base
{
}
নিম্নলিখিত কোড কম্পাইল করা হবে না, যদিও Test1
ও Test2
একই বেস ক্লাস থেকে আহরণ করা:
Test1 test1 = new Test1();
Test2 test2 = test1; // Compile error.
এটি ব্যাখ্যা করে যে আপনি কেন একজন প্রতিনিধি প্রকারটিকে অন্য একজনকে নিয়োগ করতে পারবেন না। এটি কেবলমাত্র সাধারণ সি # ভাষা।
তবে, গুরুত্বপূর্ণ বিষয়টি হ'ল আপনি কেন কোনও সামঞ্জস্যপূর্ণ প্রতিনিধিকে কোনও পদ্ধতি বা ল্যাম্বডাকে নিয়োগের অনুমতি দিচ্ছেন তা বোঝা। উপরে উল্লিখিত হিসাবে, এটি প্রতিনিধিদের জন্য সি # ভাষা সহায়তার একটি অংশ।
সুতরাং অবশেষে আপনার প্রশ্নের উত্তর দিতে:
আপনি যখন ব্যবহার করেন Invoke()
আপনি কোনও বেমানান প্রকার বরাদ্দ করার পরিবর্তে কোনও প্রতিনিধিকে পদ্ধতি বা ল্যাম্বডাস নির্ধারণের জন্য বিশেষ সি # ল্যাঙ্গুয়েজ হ্যান্ডলিং ব্যবহার করে প্রতিনিধিকে একটি মেথড কল বরাদ্দ করছেন - সুতরাং এটি ঠিক আছে comp
সম্পূর্ণ পরিষ্কার হয়ে উঠতে, কোডটি যা আপনার ওপিতে সংকলন করে:
public test Success()
{
Func<int, int> f = x => x;
return f.Invoke; // <- code successfully compiled
}
আসলে ধারণারূপে এমন কিছুতে রূপান্তরিত হয়:
public test Success()
{
Func<int, int> f = x => x;
return new test(f.Invoke);
}
যেখানে ব্যর্থ কোড দুটি অসম্পূর্ণ প্রকারের মধ্যে নির্ধারণের চেষ্টা করছে:
public test Fail()
{
Func<int, int> f = x => x;
return f; // Attempting to assign one delegate type to another: Fails
}