কনভার্ট.টোস্ট্রিং (নাল) আপনি নাল কাস্ট করলে আলাদা মানটি কেন দেয়?


উত্তর:


143

এখানে 2 টি ওভারলোড ToStringখেলতে আসে

Convert.ToString(object o);
Convert.ToString(string s);

সি # সংকলক মূলত সর্বাধিক নির্দিষ্ট ওভারলোড বাছাই করার চেষ্টা করে যা ইনপুটটির সাথে কাজ করবে। একটি nullমান যে কোনও রেফারেন্স ধরণের রূপান্তরিত হয়। এই ক্ষেত্রে stringচেয়ে বেশি সুনির্দিষ্ট objectএবং তাই এটা বিজয়ী হিসাবে বাছাই করা হবে।

মধ্যে null as objectআপনি মত প্রকাশের ধরণ দৃ solid় করেছেন object। এর অর্থ এটি আর stringওভারলোডের সাথে আর সুসংগত নয় এবং সংকলক ওভারলোডটিকে বেছে নেয় objectকারণ এটি কেবলমাত্র একমাত্র উপযুক্ত।

এই টাই ব্রেকিং কীভাবে কাজ করে তার সত্যিকারের লোমশ বিবরণগুলি সি # ল্যাঙ্গুয়েজ অনুচ্ছেদের 7.4.3 বিভাগে আচ্ছাদিত।


15
ঠিক আছে. সুতরাং এটি অন্যটির পরিবর্তে একটি ওভারলোড ব্যবহার করছে। বোধ হয়। তবে উভয়ই ওভারলোড একই জিনিস ফেরত দেওয়া উচিত নয়? +1 বিটিডব্লিউ
— জন ম্যাকআইন্টির

2
@ জনম্যাকআইন্টির - এটি সংকলক নয়, উন্নয়ন দলের উপর নির্ভর করে।
— জোনএইচ

8
@ জোহানম্যাক ইন্টিয়ের যদি এটি প্রয়োগের দিকে তাকান তবে Convert.ToString(string)এটি কেবল একটি পরিচয়ের ফাংশন এবং Convert.ToString(object)সত্যিকারের পথ অনুসরণ করা আরও কঠিন হয়ে উঠছে । এক নজরে আমি সম্মতি জানাই তাদের একই ফিরতে হবে তবে ছাত্রলীগের রূপান্তরিত স্তর এমন কিছু নয় যা আমি খুব
— জ্ঞাতযোগ্য

আমি এখানে এসেছি কীভাবে নাল বস্তুকে নাল স্ট্রিংয়ে রূপান্তর করতে হয়। অন্যান্য অনুসন্ধানকারীদের উত্তরটি হ'ল (string)null, বা যদি আপনাকে আপত্তি জানায় তবে তাকে বলা হয়(string)o
— রায়জিনজ

65

জারেডপাড়ের দুর্দান্ত ওভারলোড রেজোলিউশন উত্তরটি অনুসরণ করে - প্রশ্নটি "কেন Convert.ToString(string)নাল ফিরে আসে , তবে Convert.ToString(object)ফিরে আসে string.Empty"?

এবং যে উত্তর ... কারন ডক্স বলে তাই :

রূপান্তর। টোস্ট্রিং (স্ট্রিং) "নির্দিষ্ট স্ট্রিং ইনস্ট্যান্স প্রদান করে; কোনও প্রকৃত রূপান্তর সম্পাদন হয় না।"

রূপান্তর। টুস্ট্রিং (অবজেক্ট) "মানের স্ট্রিং উপস্থাপনা, বা স্ট্রিং .Empty প্রদান করে যদি মানটি নাল হয়।"

সম্পাদনা: এটি একটি "স্পেকের বাগ", "খুব খারাপ এপিআই নকশা", "কেন এটি এর মতো নির্দিষ্ট করা হয়েছিল" ইত্যাদি ইত্যাদি - কেন আমি দেখছি না তার জন্য আমি কিছু যুক্তি দেখিয়ে বলব এটা বড় ব্যাপার হিসাবে।

  1. System.Convertপ্রতিটি বেস টাইপকে নিজের মধ্যে রূপান্তর করার জন্য পদ্ধতি রয়েছে । এটি আশ্চর্যজনক - যেহেতু কোনও রূপান্তর প্রয়োজন হয় না বা সম্ভব হয় না, সুতরাং পদ্ধতিগুলি কেবলমাত্র প্যারামিটারটি ফিরে আসে। Convert.ToString(string)একই আচরণ করে আমি ধারণা করি কোড উত্পন্ন পরিস্থিতিতে জন্য এগুলি এখানে রয়েছে।
  2. Convert.ToString(object)পাস করার পরে 3 টি পছন্দ রয়েছে null। নিক্ষেপ করুন, নাল করুন, বা ফিরুন স্ট্রিং E নিক্ষেপ করা খারাপ হবে - দ্বিগুণ তাই ধারনা সহ এগুলি উত্পন্ন কোডের জন্য ব্যবহৃত হয়। নাল ফিরে আসার জন্য আপনার কলার একটি নাল চেক করা দরকার - আবার, উত্পন্ন কোডে দুর্দান্ত পছন্দ নয়। রিটার্নিং স্ট্রিং.এম্পটি একটি যুক্তিসঙ্গত পছন্দ বলে মনে হচ্ছে। System.Convertমানের ধরণের সাথে বাকী ডিলগুলি - যার একটি ডিফল্ট মান থাকে।
  3. নাল ফেরানো আরও "সঠিক" কিনা তা বিতর্কযোগ্য তবে স্ট্রিং। এমপিটি অবশ্যই আরও বেশি ব্যবহারযোগ্য। পরিবর্তন Convert.ToString(string)মানে "সত্যিকারের রূপান্তর নয়" নিয়ম ভঙ্গ করা। যেহেতু System.Convertএকটি স্ট্যাটিক ইউটিলিটি ক্লাস, তাই প্রতিটি পদ্ধতিটি যৌক্তিকভাবে তার নিজস্ব হিসাবে বিবেচনা করা যেতে পারে। খুব অল্প বাস্তব বাস্তব পরিস্থিতি রয়েছে যেখানে এই আচরণটি "আশ্চর্যজনক" হওয়া উচিত, সুতরাং ব্যবহারের যোগ্যতাটি (সম্ভাব্য) যথার্থতার উপরে জয়যুক্ত হোক।

এটাকে কি বলা উচিত ন্যায্যতা?
— জন ম্যাকআইন্টির

3
এটি কেন এমন তা উত্তর দেয় না। বলা এটির মতো আচরণ করে কারণ এটি এর মতো আচরণ করার নথিভুক্ত হ'ল টোটোলজিক্যাল।
— কোডসইনচাউস

2
@ জনম্যাকআইন্টির আইএমও এটি বলা খুব উপযুক্ত যে এটি খুব খারাপ এপিআই নকশা।
— কোডসইনচাওস

7
@ কোডইনচাওস - কোনও টোটোলজি নয়, আপনি যদি ধরে না নেন যে বিসিএল বিকাশের পরে ডকস পর্যবেক্ষণযোগ্য আচরণের ভিত্তিতে রচিত হয়েছে। আমি মনে করি এটি একটি অদ্ভুত ধারণা হবে। আইওডাব্লু, এটি "এটির সাথে আচরণের জন্য নথিভুক্ত" নয়, এটি "নথিবদ্ধ যে এটি এর সাথে এইরকম আচরণ করবে " - যেমন, এটি " এই জাতীয় আচরণের জন্য নির্দিষ্ট "।
— মার্ক ব্রাকেট 19

8
এটি কেবলমাত্র "কেন এমন আচরণের জন্য নির্দিষ্ট করা হয়েছিল"
— প্রশ্নটি স্থানান্তরিত করে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.