প্রথমে, আমি শুধু বলি যে জনের উত্তরটি সঠিক। এটি অনুমানের চুলের অন্যতম অঙ্গ, প্রথমে এটিতে মাথা ঘুরিয়ে দেওয়ার জন্য জনের পক্ষে খুব ভাল।
দ্বিতীয়ত, আমাকে এই লাইনটি বলতে দিন:
একটি পদ্ধতি গ্রুপ থেকে একটি সামঞ্জস্যপূর্ণ প্রতিনিধি প্রকারে একটি অন্তর্নিহিত রূপান্তর বিদ্যমান
(জোর দেওয়া) গভীরভাবে বিভ্রান্তিকর এবং দুর্ভাগ্যজনক। আমি এখানে "সামঞ্জস্যপূর্ণ" শব্দটি মুছে ফেলার বিষয়ে ম্যাডসের সাথে কথা বলব।
এটি বিভ্রান্তিকর এবং দুর্ভাগ্যজনক কারণ হ'ল কারণ দেখে মনে হচ্ছে এটি 15.2 ধারা, "ডেলিগেট সামঞ্জস্যতা" এ ডাকছে calling বিভাগ 15.2 পদ্ধতি এবং প্রতিনিধি প্রকারের মধ্যে সামঞ্জস্য সম্পর্কের বর্ণনা দিয়েছিল , তবে এটি পদ্ধতি গ্রুপ এবং প্রতিনিধি প্রকারের রূপান্তরতার প্রশ্ন , যা আলাদা।
এখন যে আমরা এটি অতিক্রম করেছি, আমরা অনুমানের of..6 অনুচ্ছেদটি ধরে চলতে পারি এবং কী পাই তা দেখতে পারি।
ওভারলোড রেজোলিউশন করতে আমাদের প্রথমে কোন ওভারলোডগুলি প্রযোজ্য প্রার্থী তা নির্ধারণ করতে হবে । প্রার্থী প্রযোজ্য যদি সমস্ত যুক্তি সুস্পষ্টভাবে ফর্মাল প্যারামিটার ধরণের রূপান্তরিত হয়। আপনার প্রোগ্রামের এই সরলীকৃত সংস্করণটি বিবেচনা করুন:
class Program
{
delegate void D1();
delegate string D2();
static string X() { return null; }
static void Y(D1 d1) {}
static void Y(D2 d2) {}
static void Main()
{
Y(X);
}
}
সুতরাং আসুন এটি লাইন লাইন মাধ্যমে যেতে।
একটি পদ্ধতি গ্রুপ থেকে একটি সামঞ্জস্যপূর্ণ প্রতিনিধি প্রকারে একটি অন্তর্নিহিত রূপান্তর বিদ্যমান।
"সামঞ্জস্যপূর্ণ" শব্দটি এখানে দুর্ভাগ্যজনক কিনা তা আমি ইতিমধ্যে আলোচনা করেছি। সরানো. ওয়াই (এক্স) এর উপর ওভারলোড রেজোলিউশন করার সময় আমরা ভাবছি, পদ্ধতি গ্রুপ এক্স কি ডি 1 তে রূপান্তর করে? এটি কি ডি 2 তে রূপান্তর করে?
একটি প্রতিনিধি টাইপ ডি এবং একটি এক্সপ্রেশন E দেওয়া হয়েছে যা পদ্ধতি গ্রুপ হিসাবে শ্রেণিবদ্ধ করা হয়েছে, E থেকে D তে একটি অন্তর্নিহিত রূপান্তর উপস্থিত রয়েছে যদি E এর কমপক্ষে একটি পদ্ধতি প্রযোজ্য তবে এটি [...] পরামিতি ব্যবহার করে নির্মিত একটি আর্গুমেন্ট তালিকায় অন্তর্ভুক্ত ধরণের প্রকার ও সংশোধক, নিম্নে বর্ণিত।
এ পর্যন্ত সব ঠিকই. এক্সে এমন একটি পদ্ধতি থাকতে পারে যা D1 বা D2 এর যুক্তি তালিকার সাথে প্রযোজ্য।
একটি পদ্ধতি গোষ্ঠী E থেকে একটি প্রতিনিধি প্রকার D তে রূপান্তরকরণের সংকলন-সময় অ্যাপ্লিকেশনটি নীচে বর্ণিত হয়েছে।
এই লাইনটি সত্যিই আকর্ষণীয় কিছু বলে না।
নোট করুন যে E থেকে D তে অন্তর্নিহিত রূপান্তরটির অস্তিত্ব কোনও গ্যারান্টি দেয় না যে রূপান্তরটির সংকলন-সময় অ্যাপ্লিকেশনটি ত্রুটি ছাড়াই সফল হবে।
এই লাইন আকর্ষণীয়। এর অর্থ হ'ল এখানে অন্তর্নিহিত রূপান্তর রয়েছে যা বিদ্যমান তবে যা ত্রুটিতে রূপান্তরিত হতে পারে! এটি সি # এর উদ্ভট নিয়ম। একটি মুহুর্তটি আবিষ্কার করতে এখানে একটি উদাহরণ দেওয়া হয়েছে:
void Q(Expression<Func<string>> f){}
string M(int x) { ... }
...
int y = 123;
Q(()=>M(y++));
এক্সপ্রেশন ট্রিতে একটি ইনক্রিমেন্ট অপারেশন অবৈধ। তবে ল্যাম্বদাটি এখনও অভিব্যক্তি গাছের ধরণে রূপান্তরযোগ্য , যদিও রূপান্তরটি কখনও ব্যবহৃত হয়, এটি ত্রুটি! এখানে মূলনীতিটি হ'ল আমরা পরবর্তীকালে অভিব্যক্তি গাছের মধ্যে কী যেতে পারে তার নিয়মগুলি পরিবর্তন করতে চাই; এই নিয়মগুলি পরিবর্তন করে টাইপ সিস্টেমের নিয়মগুলি পরিবর্তন করা উচিত নয় । আমরা আপনাকে এখনই আপনার প্রোগ্রামগুলিকে দ্ব্যর্থহীন করতে বাধ্য করতে চাই , যাতে আমরা যখন ভবিষ্যতে অভিব্যক্তি গাছগুলি আরও ভাল করার জন্য নিয়মগুলি পরিবর্তন করি তখন আমরা ওভারলোড রেজোলিউশনে ব্রেকিং পরিবর্তনগুলি প্রবর্তন করি না ।
যাইহোক, এটি উদ্ভট নিয়মের এই ধরণের আরেকটি উদাহরণ। ওভারলোড রেজোলিউশনের উদ্দেশ্যে একটি রূপান্তর বিদ্যমান থাকতে পারে তবে আসলে ব্যবহারে ত্রুটি হতে পারে। যদিও বাস্তবে, আমরা এখানে ঠিক তেমন পরিস্থিতি করছি না।
সরানো:
E (A) ফর্মের একটি পদ্ধতিতে অনুরোধের সাথে মিল রেখে একটি একক পদ্ধতি এম নির্বাচন করা হয়েছে [...] আর্গুমেন্ট তালিকা এ হ'ল এক্সপ্রেশনগুলির একটি তালিকা, প্রতিটি ফর্মালটিতে সংশ্লিষ্ট প্যারামিটারের একটি চলক [...] হিসাবে শ্রেণিবদ্ধ -ডিটারের পরিমিতি-তালিকা
ঠিক আছে. সুতরাং আমরা ডি 1 এর সাথে সম্মতিতে ওভারলোড রেজোলিউশন করি। ডি 1 এর আনুষ্ঠানিক প্যারামিটারের তালিকাটি খালি, সুতরাং আমরা এক্স () এবং আনন্দের উপর ওভারলোড রেজোলিউশন করি, আমরা একটি পদ্ধতি "স্ট্রিং এক্স ()" খুঁজে পেয়েছি যা কাজ করে। একইভাবে, ডি 2-এর আনুষ্ঠানিক প্যারামিটার তালিকাটি খালি is আবার, আমরা দেখতে পাই যে "স্ট্রিং এক্স ()" এমন একটি পদ্ধতি যা এখানে খুব কার্যকর হয়।
এখানে নীতিটি হ'ল পদ্ধতি গোষ্ঠী রূপান্তরকরণ নির্ধারণের জন্য ওভারলোড রেজোলিউশন ব্যবহার করে কোনও পদ্ধতি গোষ্ঠী থেকে একটি পদ্ধতি নির্বাচন করা প্রয়োজন এবং ওভারলোড রেজোলিউশন রিটার্নের ধরণগুলি বিবেচনা করে না ।
যদি অ্যালগরিদম [...] ত্রুটি সৃষ্টি করে তবে একটি সংকলন-সময় ত্রুটি ঘটে। অন্যথায় অ্যালগরিদম একটি একক সেরা পদ্ধতি এম উত্পাদন করে যা ডি এর সমান সংখ্যক পরামিতি রয়েছে এবং রূপান্তরটি বিদ্যমান বলে মনে করা হয়।
এক্স গ্রুপের গ্রুপে কেবল একটি পদ্ধতি রয়েছে তাই এটি অবশ্যই সেরা হতে হবে। আমরা সফলভাবে প্রমাণ করেছি যে এক্স থেকে ডি 1 এবং এক্স থেকে ডি 2 এ রূপান্তর বিদ্যমান exists
এখন, এই লাইনটি কি প্রাসঙ্গিক?
নির্বাচিত পদ্ধতি এম অবশ্যই প্রতিনিধি টাইপ ডি এর সাথে সামঞ্জস্যপূর্ণ বা অন্যথায় একটি সংকলন-সময় ত্রুটি দেখা দেয়।
আসলে, না, এই প্রোগ্রামে না। আমরা কখনই এই লাইনটি সক্রিয় করতে পারি না। কারণ, মনে রাখবেন, আমরা এখানে যা করছি তা ওয়াই (এক্স) এর উপর ওভারলোড রেজোলিউশন করার চেষ্টা করছে। আমাদের দুটি প্রার্থী ওয়াই (ডি 1) এবং ওয়াই (ডি 2) রয়েছেন। উভয় প্রযোজ্য। কোনটি ভাল ? স্পেসিফিকেশনের কোথাও আমরা এই দুটি সম্ভাব্য রূপান্তরগুলির মধ্যে বিরক্তি প্রকাশ করি না ।
এখন, কেউ অবশ্যই তর্ক করতে পারে যে বৈধ রূপান্তরটি ত্রুটি তৈরির চেয়ে আরও ভাল। এরপরে কার্যকরভাবে বলা হবে, এই ক্ষেত্রে, ওভারলোড রেজোলিউশন রিটার্নের ধরণগুলি বিবেচনা করে, যা আমরা এড়াতে চাই। তারপরে প্রশ্নটি কোন নীতিটি আরও ভাল: (1) ওভারলোডের রেজোলিউশন রিটার্নের ধরণগুলি বিবেচনা করে না এমন আক্রমণকারী বজায় রাখবে বা (২) এমন একটি রূপান্তর বাছাই করার চেষ্টা করুন যা আমরা জানি যে আমরা জানি না তার উপর কাজ করবে?
এটি একটি রায় কল। সঙ্গে lambdas , আমরা কি করতে , ধর্মান্তর এই প্রকারের মধ্যে রিটার্ন টাইপ বিবেচনা অধ্যায় 7.4.3.3 দেখুন:
ই একটি বেনামে ফাংশন, টি 1 এবং টি 2 হ'ল সমান প্যারামিটার তালিকাগুলি সহ প্রতিনিধি প্রকার বা এক্সপ্রেশন ট্রি ট্রিটস, সেই প্যারামিটার তালিকার প্রসঙ্গে ইয়ের জন্য একটি অনুমানযুক্ত রিটার্ন টাইপ এক্স উপস্থিত রয়েছে এবং নিম্নলিখিতগুলির মধ্যে একটি হোল্ড করে:
টি 1 এর রিটার্ন টাইপ ওয়াই 1 রয়েছে, এবং টি 2 এর রিটার্ন টাইপ ওয়াই 2 রয়েছে এবং এক্স থেকে Y1 তে রূপান্তরটি এক্স থেকে Y2 রূপান্তর চেয়ে ভাল
টি 1 এর রিটার্ন টাইপ ওয়াই থাকে এবং টি 2 হ'ল বাতিল হয়
দুর্ভাগ্যজনক যে পদ্ধতি গ্রুপ রূপান্তর এবং ল্যাম্বদা রূপান্তরগুলি এই ক্ষেত্রে অসঙ্গত। তবে আমি এর সাথে বেঁচে থাকতে পারি
যাইহোক, কোন রূপান্তরটি ভাল, এক্স থেকে ডি 1 বা এক্স থেকে ডি 2, এটি নির্ধারণ করার জন্য আমাদের কোনও "বেটারনেস" নিয়ম নেই। সুতরাং আমরা ওয়াই (এক্স) এর রেজোলিউশনে একটি অস্পষ্টতা ত্রুটি দিই।