অবশ্যই Func
কোনও নির্দিষ্ট প্রতিনিধি ব্যবহারের পরিবর্তে আসল কারণ হ'ল সি # আলাদাভাবে ঘোষিত প্রতিনিধিদের সম্পূর্ণ ভিন্ন ধরণের হিসাবে গণ্য করে।
যদিও Func<int, bool>
এবং Predicate<int>
উভয়েরই অভিন্ন যুক্তি এবং রিটার্নের ধরণ রয়েছে তবে সেগুলি কার্যনির্বাহী নয়। সুতরাং যদি প্রতিটি লাইব্রেরি প্রতিটি প্রতিনিধি প্যাটার্নের জন্য নিজস্ব প্রতিনিধি প্রকারের ঘোষণা করে তবে ব্যবহারকারীরা "ব্রিজিং" প্রতিনিধিদের রূপান্তর সম্পাদন না করে যতক্ষণ না those গ্রন্থাগারগুলি হস্তক্ষেপ করতে সক্ষম হয় না।
// declare two delegate types, completely identical but different names:
public delegate void ExceptionHandler1(Exception x);
public delegate void ExceptionHandler2(Exception x);
// a method that is compatible with either of them:
public static void MyExceptionHandler(Exception x)
{
Console.WriteLine(x.Message);
}
static void Main(string[] args)
{
// can assign any method having the right pattern
ExceptionHandler1 x1 = MyExceptionHandler;
// and yet cannot assign a delegate with identical declaration!
ExceptionHandler2 x2 = x1; // error at compile time
}
ফানক ব্যবহারের জন্য প্রত্যেককে উত্সাহিত করে মাইক্রোসফ্ট আশা করছে যে এটি বেমানান প্রতিনিধি প্রকারের সমস্যা দূর করবে। প্রত্যেকের প্রতিনিধিরা একসাথে দুর্দান্ত খেলবেন, কারণ তাদের প্যারামিটার / রিটার্নের ধরণের ভিত্তিতে কেবল তাদের মিলবে।
এটি সমস্ত সমস্যার সমাধান করে না, কারণ Func
(এবং Action
) out
বা ref
প্যারামিটার থাকতে পারে না , তবে সেগুলি কম ব্যবহৃত হয়।
আপডেট: মন্তব্যগুলিতে সভিশ বলেছেন:
তবুও, ফানক থেকে প্রেডিকেট এবং পিছনে কোনও প্যারামিটারের ধরণটি স্যুইচ করা কি কোনও পার্থক্য বলে মনে হচ্ছে না? কমপক্ষে এটি এখনও কোনও সমস্যা ছাড়াই সংকলন করে।
হ্যাঁ, যতক্ষণ না আপনার প্রোগ্রামটি আমার Main
ফাংশনের প্রথম লাইনে কেবল প্রতিনিধিদের জন্য পদ্ধতিগুলি বরাদ্দ করে । সংকলক নীরবে নতুন একটি প্রতিনিধি অবজেক্টে কোড উত্পন্ন করে যা পদ্ধতিতে এগিয়ে যায় forward সুতরাং আমার Main
ফাংশনে, আমি কোনও সমস্যা সৃষ্টি না করেই x1
ধরণের হয়ে উঠতে পারি ExceptionHandler2
।
তবে, দ্বিতীয় লাইনে আমি প্রথম প্রতিনিধিটিকে অন্য একটি প্রতিনিধিকে নিয়োগ করার চেষ্টা করি। এমনকি ভেবেছিল যে ২ য় প্রতিনিধি প্রকারের ঠিক একই প্যারামিটার এবং রিটার্নের ধরণ রয়েছে, সংকলক ত্রুটি দেয় CS0029: Cannot implicitly convert type 'ExceptionHandler1' to 'ExceptionHandler2'
।
সম্ভবত এটি আরও পরিষ্কার করে দেবে:
public static bool IsNegative(int x)
{
return x < 0;
}
static void Main(string[] args)
{
Predicate<int> p = IsNegative;
Func<int, bool> f = IsNegative;
p = f; // Not allowed
}
আমার পদ্ধতি IsNegative
নির্ধারণ করার জন্য একটি পুরোপুরি ভাল জিনিস p
এবং f
, ভেরিয়েবল যতদিন আমি তাই সরাসরি কি হিসাবে। তবে তারপরে আমি সেই ভেরিয়েবলগুলির মধ্যে একটিতে অন্যটির জন্য বরাদ্দ করতে পারি না।