এক্সটেনশন পদ্ধতি এবং গতিশীল অবজেক্ট


97

আমি আমার কোডটি নীচের কোড স্নিপেটে সংক্ষিপ্ত করতে যাচ্ছি।

List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());

উপরের কোডটি ঠিকঠাক কাজ করছে।

এখন আমি নিম্নলিখিত চেষ্টা করেছিলাম

dynamic dList = list;
 Console.WriteLine(dList.First());

তবে আমি রানটাইমবাইন্ডার এক্সসেপশন পাচ্ছি? এটা কেন?


এই মনে হয় এই প্রশ্নের একটি ডুপ্লিকেট মত প্রশ্ন করতে শুধু 4 দিন আগে stackoverflow.com/questions/5270782/...
jbtule

@jbtule পার্থক্যটি হ'ল thisএখানে গতিশীল, তবে আপনি যদি এখানে অবতরণ করেন তবে আপনার সম্ভবত সেই প্রশ্নটিও লক্ষ্য করা উচিত
নিক.শর্নিকভ

উত্তর:


131

স্টেসিয়ার উত্তরে প্রসারিত করার জন্য ... এক্সটেনশন পদ্ধতিগুলি এক্সটেনশন পদ্ধতিগুলির আকারে ডায়নামিক টাইপ দ্বারা সমর্থিত নয় , অর্থাত্ এগুলি উদাহরণস্বরূপ পদ্ধতি হিসাবে পরিচিত। তবে এটি কাজ করবে:

dynamic dList = list;
Console.WriteLine(Enumerable.First(dList));

অবশ্যই, এটি দরকারী বা নাও হতে পারে। আপনি কেন এবং কীভাবে গতিশীল টাইপিং ব্যবহার করার চেষ্টা করছেন সে সম্পর্কে যদি আপনি আরও তথ্য দিতে পারেন তবে আমরা আরও সহায়তা করতে সক্ষম হতে পারি।


আমি গতিশীল অবজেক্টের সাথে খেলছিলাম এবং এই ব্যতিক্রমটি পেয়েছি you আপনি কি এই বিষয়টিতে কোনও নিবন্ধ লিখেছেন, যেখানে গতিশীল অবজেক্টটি ব্যবহার বা ব্যবহার করবেন না
সন্তোষ সিংহ

19
@ গীক: ব্যক্তিগতভাবে আমার থাম্বের নিয়মটি কেবল তখনই ব্যবহার করতে হবে dynamicযেখানে আপনার সত্যই প্রয়োজন ... মূলত আপনি যদি অন্যথায় প্রতিচ্ছবি সহ সদস্যদের অ্যাক্সেস করতে চান তবে এটি একটি বড় লক্ষণ। অন্যদিকে, আমি একটি ডাই-হার্ড স্ট্যাটিক টাইপার - অন্যরা কম হতাশবাদী নীতি প্রস্তাব করতে পারে :)
জন স্কিচ

4
এটি জানার ধরণে ফিরে কাস্ট করা আরও পঠনযোগ্য হতে পারে, এটি কাজ করে: কনসোল.উরাইটলাইন (((তালিকা <int>) dList)) প্রথম ()); বা কনসোল.ওরাইটলাইন ((তালিকা হিসাবে তালিকাটি <তালিকা>)। প্রথম ());
এভিআই

141

জনের উত্তরটি প্রসারিত করার জন্য, এটি কাজ না করার কারণ হ'ল নিয়মিত, অ-গতিশীল কোড এক্সটেনশন পদ্ধতিগুলি স্ট্যাটিক শ্রেণীর জন্য সংকলককে পরিচিত সমস্ত শ্রেণীর একটি সম্পূর্ণ অনুসন্ধান করে কাজ করে যার সাথে মেলে এমন একটি এক্সটেনশন পদ্ধতি রয়েছে। নেমস্পেস নেস্টিং এবং usingপ্রতিটি নেমস্পেসে উপলভ্য নির্দেশিকাগুলির উপর ভিত্তি করে অনুসন্ধানটি যথাযথ।

এর অর্থ হ'ল ডায়নামিক এক্সটেনশন পদ্ধতির অনুরোধটি সঠিকভাবে সমাধানের জন্য, কোনও সময় ডিএলআরকে রানটাইমের সময় জানতে হবে যে সমস্ত সোর্স কোডে সমস্ত নেমস্পেস নীড় এবং usingনির্দেশাবলী ছিল । আমাদের কাছে কল সাইটটিতে সমস্ত তথ্য এনকোড করার জন্য কোনও ব্যবস্থা নেই। আমরা এই জাতীয় প্রক্রিয়া আবিষ্কার করার বিষয়টি বিবেচনা করেছি, তবে সিদ্ধান্ত নিয়েছি যে এটি অত্যধিক ব্যয়বহুল এবং এর মূল্য নির্ধারণের জন্য খুব শিডিউল ঝুঁকি তৈরি করেছে।


ব্যাখ্যার জন্য আপনাকে অনেক ধন্যবাদ।
সন্তোষ সিংহ

4
উপস্থাপনে কি এমন বৈশিষ্ট্য রয়েছে? এটি অবশ্যই একটি ব্রেকিং পরিবর্তন হবে; কলগুলি বর্তমানে রানটাইমবাইন্ডার এক্সপ্রেশনস নিক্ষেপ করছে হঠাৎ পুনরায় সংস্থার উত্সের উপর কাজ শুরু করবে। এছাড়াও, এই জাতীয় বৈশিষ্ট্যটি বাস্তবায়নের সাথে কি কোনও সুরক্ষা ঝুঁকি রয়েছে?
অনি

5
@ani: আমরা কি সেই বৈশিষ্ট্যটি বাস্তবায়নের পরিকল্পনা করছি? না। কোন সুরক্ষা ঝুঁকি আছে? আমি কারও সম্পর্কে সচেতন নই; আপনার মনে কী ধরণের সুরক্ষা ঝুঁকি ছিল? আক্রমণকারী কে এবং ব্যবহারকারীকে তারা কী হুমকি দিচ্ছে তা বলে শুরু করুন।
এরিক লিপার্ট

@ এরিকলিপার্ট, আমি বুঝতে পেরেছি যে সমস্ত dynamicবস্তু সি # এর সমান: DynamicObjectসুতরাং তাদের পার্থক্য করার কোন উপায় নেই এবং এটির কারণগুলির মধ্যে একটি কারণ কেন সম্ভব হয় না যাতে এক্সটেনশন পদ্ধতি যুক্ত করা যায় dynamic, তাই না?
টম সার্ডু

@ এরিকলিপার্ট এই উত্তরটিকে আরও কিছুটা প্রসারিত করার বিষয়ে বিবেচনা করুন এবং "যখন কোনও পরামিতি গতিশীল থাকে, তখন সমস্ত রেজোলিউশন রান-টাইম পর্যন্ত পিছিয়ে দেওয়া হয়"। যদিও এটা আপনাকে সুস্পষ্ট এই গুরুত্বপূর্ণ বিট তাই কোথাও খুঁজে কঠিন (দেখুন stackoverflow.com/questions/48324768 উদাহরণস্বরূপ)
আলেক্সেই Levenkov

18

কারণ First()একটি পদ্ধতি নয় List। এটি লিনক এক্সটেনশান থেকে সংজ্ঞায়িত করা হয়েছেIEnumerable<>

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