কোনও পদ্ধতি যুক্ত করা কেন দ্বিপাক্ষিক কল যুক্ত করবে, যদি তা অস্পষ্টতার সাথে জড়িত না হয়


112

আমার এই ক্লাস আছে

public class Overloaded
{
    public void ComplexOverloadResolution(params string[] something)
    {
        Console.WriteLine("Normal Winner");
    }

    public void ComplexOverloadResolution<M>(M something)
    {
        Console.WriteLine("Confused");
    }
}

আমি যদি এটিকে কল করি:

        var blah = new Overloaded();
        blah.ComplexOverloadResolution("Which wins?");

এটি Normal Winnerকনসোলকে লিখেছে ।

তবে, আমি যদি অন্য একটি পদ্ধতি যুক্ত করি:

    public void ComplexOverloadResolution(string something, object somethingElse = null)
    {
        Console.WriteLine("Added Later");
    }

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

নিম্নলিখিত পদ্ধতিগুলি বা বৈশিষ্ট্যগুলির মধ্যে কলটি দ্ব্যর্থক:> ' Overloaded.ComplexOverloadResolution(params string[])' এবং ' Overloaded.ComplexOverloadResolution<string>(string)'

আমি বুঝতে পারি যে একটি পদ্ধতি যোগ করার সময় একটি কল অস্পষ্টতা পরিচয় করিয়ে পারে, কিন্তু এটিকে দুটি পদ্ধতির মধ্যে একটি দ্ব্যর্থতা ইতিমধ্যে অস্তিত্ব নেই (params string[])এবং <string>(string)! স্পষ্টতই অস্পষ্টতার সাথে জড়িত দুটি পদ্ধতির কোনওটিই নতুন যুক্ত পদ্ধতি নয়, কারণ প্রথমটি একটি প্যারাম এবং দ্বিতীয়টি জেনেরিক।

এটি কি বাগ? অনুমানের কোন অংশ বলে যে এটি হওয়া উচিত?


2
আমি মনে করি না যে পদ্ধতিটি 'Overloaded.ComplexOverloadResolution(string)'বোঝায় <string>(string); আমি মনে করি এটি (string, object)কোনও পদার্থ সরবরাহ না করে পদ্ধতিটিকে বোঝায় ।
ফুগ

1
@ ফুগ ওহ, স্ট্যাকওভারফ্লো যে ডেটাটি এটি ট্যাগ হিসাবে কাটা হয়েছে তবে ত্রুটি বার্তায় টেমপ্লেট ডিজাইনার রয়েছে। আমি এটিকে আবার যুক্ত করছি
ম্যাককে

তুমি আমাকে ধরে ফেলেছ! আমি আমার উত্তরে অনুমানের সম্পর্কিত বিভাগগুলি উদ্ধৃত করেছি, তবে আমি পড়ার এবং বুঝতে বুঝতে শেষ আধ ঘন্টা ব্যয় করি নি!
ফুগ

@ ফুগ, অনুমানের সেই অংশগুলি দেখে, আমি নিজে এবং অন্য দুটি পদ্ধতি ছাড়া অন্য পদ্ধতিতে অস্পষ্টতা প্রবর্তনের বিষয়ে কিছুই দেখতে পাচ্ছি না।
ম্যাককে

আমার কাছে এটি ঘটেছে যে এটি কেবল রক-পেপার-কাঁচি : দুটি স্বতন্ত্র মানের যে কোনও সেটটিতে বিজয়ী থাকে, তবে তিনটি মানের সম্পূর্ণ সেটটি হয় না।
ফগ 14

উত্তর:


107

এটি কি বাগ?

হ্যাঁ.

অভিনন্দন, আপনি ওভারলোড রেজোলিউশনে একটি বাগ খুঁজে পেয়েছেন। বাগ সি # 4 এবং 5 এ পুনরুত্পাদন করে; এটি শব্দার্থ বিশ্লেষকের "রোজলিন" সংস্করণে পুনরুত্পাদন করে না। আমি সি # 5 পরীক্ষা দলকে জানিয়েছি, এবং আশা করি আমরা চূড়ান্ত প্রকাশের আগে এই তদন্ত এবং সমাধান করতে পারি। (সর্বদা হিসাবে, কোন প্রতিশ্রুতি।)

একটি সঠিক বিশ্লেষণ অনুসরণ করা হয়। প্রার্থীরা হলেন:

0: C(params string[]) in its normal form
1: C(params string[]) in its expanded form
2: C<string>(string) 
3: C(string, object) 

প্রার্থী শূন্য স্পষ্টতই প্রয়োগযোগ্য না কারণ stringরূপান্তরযোগ্য নয় string[]। যে তিনটি ছেড়ে।

তিনটির মধ্যে আমাদের অবশ্যই একটি অনন্য সেরা পদ্ধতি নির্ধারণ করতে হবে। আমরা বাকি তিন প্রার্থীর জোড়ায় তুলনা করে এটি করি। এরকম তিনটি জুড়ি রয়েছে। বাদ দেওয়া alচ্ছিক প্যারামিটারগুলি কেটে ফেলার পরে তাদের সকলের অভিন্ন প্যারামিটারের তালিকা রয়েছে, যার অর্থ হ'ল স্পেসিফিকেশনের .5.৫.৩.২ বিভাগে বর্ণিত উন্নত টাইব্রেকিং রাউন্ডে যেতে হবে।

কোনটি ভাল, 1 বা 2? প্রাসঙ্গিক টাইব্রেকারটি হ'ল জেনেরিক পদ্ধতিটি সর্বদা একটি নন-জেনেরিক পদ্ধতির চেয়ে খারাপ। 2 টি 1 এর চেয়েও খারাপ So সুতরাং 2 জন বিজয়ী হতে পারে না।

কোনটি ভাল, 1 বা 3? সম্পর্কিত টাইব্রেকার হ'ল: কেবল তার প্রসারিত আকারে প্রযোজ্য একটি পদ্ধতিটি তার সাধারণ আকারে প্রযোজ্য পদ্ধতির চেয়ে সর্বদা খারাপ। সুতরাং 1 টি 3 এর চেয়েও খারাপ So সুতরাং 1 বিজয়ী হতে পারে না।

কোনটি ভাল, 2 বা 3? প্রাসঙ্গিক টাইব্রেকারটি হ'ল জেনেরিক পদ্ধতিটি সর্বদা একটি নন-জেনেরিক পদ্ধতির চেয়ে খারাপ। 2 3 এর চেয়ে খারাপ, সুতরাং 2 বিজয়ী হতে পারে না।

একাধিক প্রযোজ্য প্রার্থীদের একটি সেট থেকে বাছাই করতে একজন প্রার্থীকে অবশ্যই (১) অপরাজিত থাকতে হবে, (২) কমপক্ষে অন্য একজন প্রার্থীকে পরাজিত করতে হবে এবং (৩) প্রথম দুটি বৈশিষ্ট্যযুক্ত অনন্য প্রার্থী হতে হবে। তিনজন প্রার্থী অন্য কোনও প্রার্থীকে মারধর করেন এবং কমপক্ষে অন্য একজন প্রার্থীকে মারধর করেন; এই সম্পত্তি সহ এটিই একমাত্র প্রার্থী। সুতরাং প্রার্থী তিনটি অনন্য সেরা প্রার্থী । এটা জিততে হবে।

কেবল সি # 4 সংকলকটি এটি ভুল হয়ে উঠছে না, কারণ আপনি সঠিকভাবে লক্ষ্য করেছেন যে এটি একটি উদ্ভট ত্রুটি বার্তার প্রতিবেদন করছে। যে সংকলকটি ওভারলোড রেজোলিউশন বিশ্লেষণ ভুলটি পেয়েছে তা একটু অবাক করার মতো। এটি যে ত্রুটির বার্তাটি ভুল পেয়েছে তা সম্পূর্ণ উদ্বেগজনক নয়; "দ্ব্যর্থহীন পদ্ধতি" ত্রুটি হিউরিস্টিক মূলত প্রার্থী সেট থেকে কোনও দুটি পদ্ধতি বেছে নেয় যদি কোনও সেরা পদ্ধতি নির্ধারণ করা যায় না। "প্রকৃত" অস্পষ্টতা খুঁজে পাওয়া খুব ভাল নয়, যদি বাস্তবে এটি থাকে।

কেউ যুক্তিসঙ্গতভাবে জিজ্ঞাসা করতে পারে যে এটি কেন। এটা বেশ এটি বড় দায়! দুই পদ্ধতি হল "unambigously দ্ব্যর্থক" কারণ "betterness" সম্পর্ক নেই অকর্মক । এমন পরিস্থিতিতে উপস্থিত হওয়া সম্ভব যেখানে প্রার্থী 1 2 এর চেয়ে 2 জন ভাল, 3 এর চেয়ে 2 জন ভাল এবং 1 টির চেয়ে 3 জন ভাল such

আমি রোজলিনের পক্ষে এই ধর্মীয় তাত্ত্বিক উন্নতি করতে চাই তবে এটি একটি কম অগ্রাধিকার।

(পাঠকের কাছে অনুশীলন করুন: "এমন একটি এন উপাদানগুলির একটি অনন্য সেরা সদস্যকে চিহ্নিত করার জন্য একটি লিনিয়ার-টাইম অ্যালগরিদম তৈরি করুন যেখানে দ্বিপত্য সম্পর্কটি আন্তঃসংযোগমূলক" এই দলের হয়ে আমার সাক্ষাত্কারের দিন জিজ্ঞাসা করা হয়েছিল এমন প্রশ্নগুলির মধ্যে একটি ছিল এটি নয়) একটি খুব শক্ত অ্যালগরিদম; একটি শট দিন।)

এত দিন ধরে # সিতে বিকল্প argu যুক্তি যুক্ত করার পিছনে আমরা যে কারণ পিছিয়ে দিয়েছিলাম তার একটি কারণ ছিল ওভারলোড রেজোলিউশন অ্যালগরিদমের সাথে জটিল জটিল অস্পষ্ট পরিস্থিতিগুলির সংখ্যা; দৃশ্যত আমরা এটি সঠিকভাবে পাইনি।

আপনি যদি এটি কোনও ট্র্যাক করতে কোনও সংযোগ সমস্যা প্রবেশ করতে চান তবে নির্দ্বিধায়। আপনি যদি এটি কেবল আমাদের নজরে আনতে চান তবে এটি সম্পন্ন করুন। আমি পরের বছর পরীক্ষা দিয়ে অনুসরণ করব।

এটা আমার নজরে আনার জন্য ধন্যবাদ। ত্রুটির জন্য দুঃখিত।


1
উত্তরের জন্য ধন্যবাদ. আপনি বলেছিলেন যে "1 2 এর চেয়ে খারাপ", তবে আমার কাছে পদ্ধতিটি 1 এবং 2 থাকলে এটি 1 টি পদ্ধতি বাছায়?
ম্যাককে

@ এমসকে: উফফফফফফফফফফফফফফফফফফফফফফফবফবয, ওরে ঠিক বললাম। আমি লেখাটি ঠিক করব।
এরিক লিপার্ট

1
এটি "বছরের বাকি অংশ"
বাক্যটি

2
@ বল্টক্লক প্রকৃতপক্ষে, "বছরের বাকি সময় ছেড়ে" এই বিবৃতিটি একদিনের ছুটি বোঝায়।
ফুগ

1
আমি তাই মনে করি. আমি "3) পড়ি যে অনন্য প্রার্থী যার প্রথম দুটি বৈশিষ্ট্য রয়েছে" হিসাবে "" একমাত্র প্রার্থী হবেন যা (অপরাজিত এবং কমপক্ষে অন্য একজন প্রার্থীকে মারধর করে) " । কিন্তু আপনার সবচেয়ে সাম্প্রতিক মন্তব্য আমার মনে হয় "এবং বিটের অন্তত এক অন্য প্রার্থী (শুধুমাত্র প্রার্থী যে অপরাজিত হতে)" । ইংরাজী সত্যই গ্রুপিং প্রতীক ব্যবহার করতে পারে। যদি পরেরটি সত্য হয় তবে আমি এটি আবার পেয়েছি।
default.kramer

5

অনুমানের কোন অংশ বলে যে এটি হওয়া উচিত?

বিভাগ 7.5.3 (ওভারলোড রেজোলিউশন) সহ বিভাগ 7.4 (সদস্য অনুসন্ধান) এবং 7.5.2 (অনুমানের প্রকার)।

বিশেষত বিভাগ 7.5.3.2 (আরও ভাল ফাংশন সদস্য) নোট করুন, যা অংশে "কোন যুক্তিযুক্ত alচ্ছিক প্যারামিটারগুলি প্যারামিটার তালিকা থেকে অপসারণ করা হবে" এবং "যদি এম (পি) হয় তবে একটি জেনেরিক পদ্ধতি amd এম (কি) হয় একটি জেনেরিক পদ্ধতি, তাহলে এম (পি) এম (কিউ) এর চেয়ে ভাল ""

যাইহোক, অনুমানের এই অংশগুলি এই আচরণটি নিয়ন্ত্রণ করে কিনা তা জানার জন্য আমি অনুমিতের এই অংশগুলি পুরোপুরি বুঝতে পারি না, এটি অনুগত কিনা তা বিচার করতে দেওয়া যাক।


তবে এটি ব্যাখ্যা করে না যে কেন সদস্য যুক্ত করা ইতিমধ্যে বিদ্যমান দুটি পদ্ধতির মধ্যে দ্বিধাগ্রস্থতা সৃষ্টি করবে।
ম্যাককে

@ এমসকেয়ে ফর্সা (সম্পাদনা দেখুন)। এটি সঠিক আচরণ কিনা তা আমাদের জানানোর জন্য আমাদের কেবল অপেক্ষা করতে হবে: ->
ফুগ

1
সেগুলি হ'ল স্পেকের সঠিক অংশ। সমস্যা হ'ল তারা বলে যে এটি হওয়া উচিত নয় !
এরিক লিপার্ট

3

কিছু পদ্ধতিতে প্রথম প্যারামিটারের নাম পরিবর্তন করে এবং আপনি যে প্যারামিটারটি নির্ধারণ করতে চান তা নির্দিষ্ট করে আপনি এই অস্পষ্টতা এড়াতে পারেন

এটার মত :

public class Overloaded
{
    public void ComplexOverloadResolution(params string[] somethings)
    {
        Console.WriteLine("Normal Winner");
    }

    public void ComplexOverloadResolution<M>(M something)
    {
        Console.WriteLine("Confused");
    }

    public void ComplexOverloadResolution(string something, object somethingElse = null)
    {
        Console.WriteLine("Added Later");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Overloaded a = new Overloaded();
        a.ComplexOverloadResolution(something:"asd");
    }
}

ওহ, আমি জানি এই কোডটি খারাপ, এবং এর চারপাশে কাজ করার বিভিন্ন উপায় রয়েছে, প্রশ্নটি ছিল "সংকলকটি কেন এইভাবে আচরণ করে?"
ম্যাককে

1

আপনি যদি paramsআপনার প্রথম পদ্ধতিটি অপসারণ করেন তবে এটি হবে না। আপনার প্রথম এবং তৃতীয় পদ্ধতিতে উভয়ই বৈধ কল রয়েছে ComplexOverloadResolution(string), তবে আপনার প্রথম পদ্ধতিটি থাকলে public void ComplexOverloadResolution(string[] something)কোনও দ্বিধা নেই।

কোনও প্যারামিটারের জন্য সরবরাহের মান object somethingElse = nullএটি alচ্ছিক প্যারামিটার করে তোলে এবং এইভাবে ওভারলোডটি কল করার সময় এটি নির্দিষ্ট করতে হবে না।

সম্পাদনা করুন: সংকলকটি এখানে কিছু ক্রেজি জিনিস করছে। আপনি যদি আপনার প্রথমটির পরে কোডে আপনার তৃতীয় পদ্ধতিটি সরান, এটি সঠিকভাবে প্রতিবেদন করবে। সুতরাং মনে হচ্ছে এটি প্রথম দুটি ওভারলোড গ্রহণ করছে এবং সঠিকটির জন্য পরীক্ষা না করেই তাদের প্রতিবেদন করছে।

'কনসোল অ্যাপ্লিকেশন ১.প্রগ্রাম.কম্পলক্স ওভারলোডআরসিউশন (প্যারামস স্ট্রিং [])' এবং 'কনসোল অ্যাপ্লিকেশন ১.প্রগ্রাম.কম্পলেক্স ওভারলোডলিউশন (স্ট্রিং, অবজেক্ট)'

সম্পাদনা 2: নতুন অনুসন্ধান। উপরের তিনটি থেকে যে কোনও পদ্ধতি অপসারণ করলে উভয়ের মধ্যে কোনও দ্বিধাগ্রস্ততা তৈরি হবে না। সুতরাং মনে হয় দ্বন্দ্বটি কেবল তখনই দেখা দেয় যদি অর্ডার নির্বিশেষে তিনটি পদ্ধতি উপস্থিত থাকে।


তবে এটি ব্যাখ্যা করে না যে কেন সদস্য যুক্ত করা ইতিমধ্যে বিদ্যমান দুটি পদ্ধতির মধ্যে দ্বিধাগ্রস্থতা সৃষ্টি করবে।
ম্যাককে

অস্পষ্টতা আপনার প্রথম এবং তৃতীয় পদ্ধতির মধ্যে ঘটে তবে সংকলকটি কেন অন্য দুটি প্রতিবেদন করে তা আমার বাইরে is
টমিসালভ মার্কভস্কি

তবে আমি যদি দ্বিতীয় পদ্ধতিটি সরিয়ে ফেলি তবে আমার কোনও দ্বিধা নেই, এটি সফলভাবে তৃতীয় পদ্ধতিটিকে কল করে। সুতরাং দেখে মনে হচ্ছে না যে সংকলকটির প্রথম এবং তৃতীয় পদ্ধতির মধ্যে দ্বিধাদ্বন্ধ রয়েছে।
ম্যাককে

আমার সম্পাদনা দেখুন। ক্রেজি সংকলক।
টমিসলভ মার্কভস্কি

প্রকৃতপক্ষে, মাত্র দুটি পদ্ধতির যে কোনও সংমিশ্রণ কোনও অস্পষ্টতা তৈরি করে না। এটি খুব বিজোড়। Edit2।
টমিসলভ মার্কভস্কি

1
  1. যদি লিখি

    var blah = new Overloaded();
    blah.ComplexOverloadResolution("Which wins?");

    বা শুধু লিখুন

    var blah = new Overloaded();
    blah.ComplexOverloadResolution();

    এটি একই পদ্ধতিতে , পদ্ধতিতে শেষ হবে

    public void ComplexOverloadResolution(params string[] something

    এটি কারণ paramsকীওয়ার্ড যা এর থেকে এটি সর্বোত্তমভাবে মিলে যায় যখন কোনও পরামিতি নির্দিষ্ট না থাকে

  2. আপনি যদি এইভাবে ইয়ুর নতুন পদ্ধতি যুক্ত করার চেষ্টা করেন

    public void ComplexOverloadResolution(string something)
    {
        Console.WriteLine("Added Later");
    }

    এটি এই পদ্ধতিটিকে পুরোপুরি সংকলন করবে এবং কল করবে কারণ এটি কোনও প্যারামিটারের সাথে আপনার কলের জন্য এক উপযুক্ত মিলstring । তখন অনেক বেশি শক্তিশালী params string[] something

  3. আপনি যেমন করেছিলেন তেমনি দ্বিতীয় পদ্ধতি ঘোষণা করুন

    public void ComplexOverloadResolution(string something, object something=null);

    সংকলক, প্রথম পদ্ধতি এবং এটির মধ্যে মোট বিভ্রান্তিতে লাফিয়ে সবেমাত্র একটি যুক্ত করেছে। কারণ তিনি জানেন না যে এখন আপনার ডাকে তাঁর সমস্ত ফাংশনটি কী করা উচিত

    var blah = new Overloaded();
    blah.ComplexOverloadResolution("Which wins?");

    প্রকৃতপক্ষে, আপনি যদি নীচের কোডের মতো কল থেকে স্ট্রিং প্যারামিটারটি সরিয়ে থাকেন, সবকিছু সঠিকভাবে সংকলন করে এবং আগের মতো কাজ করে

    var blah = new Overloaded();
    blah.ComplexOverloadResolution(); // will be ComplexOverloadResolution(params string[] something) function called here, like a best match.

প্রথমত, আপনি দুটি কলিং কেস লিখুন যা একই। অবশ্যই এটি একই পদ্ধতিতে চলে যাবে, বা আপনি কি অন্যরকম কিছু লিখতে চাইছেন?
ম্যাককে

তবে আবার, আমি যদি আপনার বাকী উত্তরটি সঠিকভাবে বুঝতে পারি তবে আপনি সংকলকটি যা বলে তা পড়ছেন না, যথা প্রথম এবং দ্বিতীয় পদ্ধতির মধ্যে, আমি যুক্ত হওয়া নতুন তৃতীয়টি নয় not
ম্যাককে

আহ, ধন্যবাদ তবে এটি এখনও আপনার পোস্টটিতে আমার দ্বিতীয় মন্তব্যে উল্লেখ করা সমস্যাটি রেখে দেয়।
ম্যাককে

আরও স্পষ্ট করার জন্য, আপনি "সংকলক, প্রথম পদ্ধতি এবং এটির মধ্যে সম্পূর্ণ বিভ্রান্তিতে ঝাঁপিয়ে পড়েছেন, কেবল একটি যুক্ত করেছেন state" তবে তা হয় না। এটি অন্য দুটি পদ্ধতিতে বিভ্রান্তিতে ঝাঁপিয়ে পড়েছে। প্যারাম পদ্ধতি এবং জেনেরিক পদ্ধতি।
ম্যাককে

@ এমসকে: হ্যালো, stateসুনির্দিষ্ট হওয়ার জন্য এটি একক বা দু'জনের নয়, তিনটি ফাংশন প্রদানে বিভ্রান্তিতে পড়েছে । প্রকৃতপক্ষে, কোনও সমস্যা সমাধানের জন্য, তাদের মধ্যে কোনও মন্তব্য করার পক্ষে এটি যথেষ্ট । উপলভ্য ফাংশনগুলির মধ্যে সেরা মিলটি হ'ল এটির সাথে একটি params, দ্বিতীয়টি হ'ল genericsপ্যারামিটারযুক্ত, যখন আমরা তৃতীয়টি যুক্ত করি এটি setকোনও ফাংশনে বিভ্রান্তি সৃষ্টি করে। আমি মনে করি, এটি সম্ভবত, সংকলক দ্বারা উত্পাদিত ত্রুটি বার্তা পরিষ্কার নয়।
টিগ্রান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.