কেন এই কোড কাজ করে? আমি ভিজুয়াল স্টুডিও 2019 এর সাথে সি # 8 ব্যবহার করছি।
আপনি আপনার নিজের প্রশ্নের উত্তর দিয়েছেন! কারণ আপনি সি # 8 ব্যবহার করছেন।
সি # 1 থেকে 7 এর নিয়মটি ছিল: একটি সাধারণ নাম একই স্থানীয় ক্ষেত্রের দুটি ভিন্ন জিনিস বোঝাতে ব্যবহার করা যায় না। (প্রকৃত নিয়ম তার চেয়ে কিছুটা জটিল ছিল তবে কীভাবে ক্লান্তিকর তা বর্ণনা করে; বিশদ বিবরণের জন্য সি # স্পেসিফিকেশন দেখুন))
এই নিয়মের উদ্দেশ্যটি হ'ল আপনি নিজের উদাহরণে যে ধরণের পরিস্থিতি সম্পর্কে কথা বলছেন তা প্রতিরোধ করা, যেখানে স্থানীয় অর্থটি সম্পর্কে বিভ্রান্ত হওয়া খুব সহজ হয়ে যায়। বিশেষতঃ এই বিধিটি এমন বিভ্রান্তি রোধের জন্য তৈরি করা হয়েছিল:
class C
{
int x;
void M()
{
x = 123;
if (whatever)
{
int x = 356;
...
আর এখন আমরা একটি পরিস্থিতির শরীরে যেখানে আছে M
, x
মানে উভয় this.x
এবং স্থানীয় x
।
যদিও উদ্দেশ্যপ্রণোদিত, এই বিধি নিয়ে বেশ কয়েকটি সমস্যা ছিল:
- এটি অনুমান করা হয়নি। এমন পরিস্থিতি ছিল যেখানে সরল নামটি প্রকার এবং সম্পত্তি উভয় হিসাবে ব্যবহৃত হতে পারে তবে এগুলি ত্রুটি হিসাবে সর্বদা চিহ্নিত করা হত না কারণ ত্রুটি সনাক্তকরণের যুক্তি ত্রুটিযুক্ত ছিল। (নিচে দেখ)
- ত্রুটি বার্তাগুলি বিভ্রান্তিকরভাবে শব্দযুক্ত এবং বেমানান প্রতিবেদন করা হয়েছিল। এই পরিস্থিতির জন্য একাধিক পৃথক ত্রুটি বার্তা ছিল। তারা বেআইনীভাবে অপরাধীকে চিহ্নিত করেছিল; তা হল, কখনও কখনও অভ্যন্তরীণ ব্যবহার ডাকা হত, কখনও কখনও বাহ্যিক এবং কখনও কখনও এটি কেবল বিভ্রান্তিকর হয়।
আমি এটিকে সাজানোর জন্য রোজলাইন পুনরায় লেখায় একটি প্রচেষ্টা করেছি; আমি কিছু নতুন ত্রুটি বার্তা যুক্ত করেছি এবং পুরানোগুলি ত্রুটিটি কোথায় রিপোর্ট করা হয়েছে সে সম্পর্কে সামঞ্জস্য রেখেছি। তবে এই প্রচেষ্টাটি খুব অল্প, খুব দেরিতে হয়েছিল।
সি # টি টি সি # 8 এর জন্য সিদ্ধান্ত নিয়েছিল যে পুরো নিয়মটি প্রতিরোধের চেয়ে আরও বিভ্রান্তি সৃষ্টি করছে এবং ভাষা থেকে এই নিয়ম অবসর নেওয়া হয়েছিল। (অবসর কখন ঘটেছিল তা নির্ধারণ করার জন্য ধন্যবাদ জোনাথন চেজ।)
আপনি যদি এই সমস্যার ইতিহাস জানতে আগ্রহী হন এবং আমি কীভাবে এটি ঠিক করার চেষ্টা করেছি, আমি এই সম্পর্কে নিবন্ধগুলি দেখুন:
https://ericlippert.com/2009/11/02/simple-names-are-not-so-simple/
https://ericlippert.com/2009/11/05/simple-names-are-not-so-simple-part-two/
https://ericlippert.com/2014/09/25/confusing-errors-for-a-confusing-feature-part-one/
https://ericlippert.com/2014/09/29/confusing-errors-for-a-confusing-feature-part-two/
https://ericlippert.com/2014/10/03/confusing-errors-for-a-confusing-feature-part-three/
তৃতীয় অংশের শেষে আমি উল্লেখ করেছি যে এই বৈশিষ্ট্য এবং "রঙিন রঙ" বৈশিষ্ট্যের মধ্যে একটি মিথস্ক্রিয়াও ছিল - এটি এমন বৈশিষ্ট্য যা এতে অনুমতি দেয়:
class C
{
Color Color { get; set; }
void M()
{
Color = Color.Red;
}
}
এখানে আমরা সহজ নাম ব্যবহার করেছি Color
এবং উভয় this.Color
এবং গণিত প্রকারের উল্লেখ করতে Color
; স্পেসিফিকেশনটির কঠোর পাঠ অনুসারে এটি একটি ত্রুটি হওয়া উচিত, তবে এই ক্ষেত্রে অনুমানটি ভুল ছিল এবং উদ্দেশ্যটি ছিল এটির অনুমতি দেওয়া, কারণ এই কোডটি দ্ব্যর্থহীন এবং এটি বিকাশকারীকে এটি পরিবর্তন করা ভীতিজনক হবে।
এই দুটি নিয়মের মধ্যে সমস্ত অদ্ভুত মিথস্ক্রিয়া বর্ণনা করে আমি আর্টিকেলটি কখনই লিখিনি, এবং এখনই এটি করা কিছুটা অর্থহীন হবে!
x
পদ্ধতিতে পুরো পরামিতিটি সুযোগের বাইরে চলে যায়। উদাহরণের জন্য শার্পল্যাব দেখুন ।