কাস্ট তালিকা <T> << অন্তর্ভুক্ত> তালিকায়


উত্তর:


249

আপনি এটিকে কাস্ট করতে পারবেন না (রেফারেন্স পরিচয় সংরক্ষণ করুন) - এটি অনিরাপদ। উদাহরণ স্বরূপ:

public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];

সম্প্রচারের কারণে এখন আপনি List<Apple>একটি IEnumerable<IFruit>নেট নেট 4 / সি # 4 এ রূপান্তর করতে পারেন , তবে আপনি যদি চান তবে আপনাকে List<IFruit>একটি নতুন তালিকা তৈরি করতে হবে । উদাহরণ স্বরূপ:

// In .NET 4, using the covariance of IEnumerable<T>
List<IFruit> fruit = apples.ToList<IFruit>();

// In .NET 3.5
List<IFruit> fruit = apples.Cast<IFruit>().ToList();

তবে এটি মূল তালিকা ingালাইয়ের মতো নয় - কারণ এখন দুটি পৃথক তালিকা রয়েছে। এটি নিরাপদ, তবে আপনাকে বুঝতে হবে যে একটি তালিকায় করা পরিবর্তনগুলি অন্য তালিকায় দেখা যাবে না । ( তালিকাগুলি উল্লিখিত অবজেক্টগুলির পরিবর্তন অবশ্যই দেখা যাবে))


6
যেমন তারা 'এখনও বিল্ডিংয়ে'!
আন্দ্রেস জোল্টান

1
কোভেরিয়েন্স টোলিস্ট করা এবং নতুন তালিকা <ফ্রুট> () করার মধ্যে পার্থক্য কী; তারপরে আসল তালিকার উপরে একটি ভবিষ্যদ্বাণী এবং প্রতিটি আইফ্রু তালিকায় যুক্ত করে? পূর্বাঞ্চ উপায়ে ... অবজেক্ট রেফারেন্স একই হবে, সঠিক? সুতরাং ... যদি এটি সত্য হয় তবে ব্যক্তিগতভাবে আমার কাছে এটি সামান্যই বোধ করা যায় যে আপনি কেবল পুরো তালিকাটি সরাসরি কাস্ট করতে পারবেন না। ?
রবার্ট নোক

3
@ রবার্টনোক: "অবজেক্ট রেফারেন্স" বলতে কী বোঝ? প্রতিটি উপাদানের অবজেক্ট রেফারেন্স একই, তবে তালিকার রেফারেন্সটি নিজেই কাস্টিংয়ের মতো নয়। ধরুন আপনি রেফারেন্সটি কাস্ট করতে পারলেন, যাতে আপনার কাছে সংকলন-টাইম টাইপের List<IFruit>একটি রেফারেন্স ছিল যা আসলে একটি এর রেফারেন্স ছিল List<Apple>। আপনি যদি এর সাথে একটি Bananaরেফারেন্স যুক্ত করেন তবে আপনি কী হওয়ার আশা করবেন List<IFruit>?
জন স্কিটি 20'14

1
উহু. আমি মনে করি আমার কীভাবে পড়তে হবে তা শিখতে হবে। আমি ভেবেছিলাম আসল উত্তরটি বলেছিল যে তালিকার অবজেক্টগুলি গভীরভাবে অনুলিপি করা হবে এবং পুনরায় তৈরি করা হবে যা আমার কাছে বোধগম্য নয়। তবে আমি সেই অংশটি স্পষ্টভাবে মিস করেছি যেখানে একই জিনিসগুলির সাথে কেবল একটি নতুন তালিকা তৈরি করা হয়েছে।
রবার্ট নোক

2
@ TrươngQuốcKhánh: আমি কোন ধারণা আছে কি কোন মত আপনার কোড রূপ, অথবা আপনি একটি আছে কিনা usingজন্য নির্দেশ System.Linq, বা কি আপনি এটা কল করার চেষ্টা করছেন আমি নিশ্চিত তুমি আমাকে কিভাবে সাহায্য করতে সক্ষম হতে আশা নই। আমি আপনাকে আরও গবেষণা করার পরামর্শ দিচ্ছি এবং যদি আপনি এখনও আটকে থাকেন তবে আপনি একটি ন্যূনতম প্রজননযোগ্য উদাহরণ সহ একটি প্রশ্ন জিজ্ঞাসা করুন ।
জন স্কেটি

6

একটি কাস্ট পুনরুক্তি এবং। টোললিস্ট ():

List<IDic> casted = input.Cast<IDic>().ToList() কৌতুক করবে

মূলত আমি বলেছিলাম যে সমবায় কাজ করবে - তবে জন ঠিক যেমন উল্লেখ করেছেন; না এটা হবে না!

এবং মূলত আমিও বোকামিভাবে ToList()কলটি ছেড়ে দিয়েছি


Castএকটি IEnumerable<T>না List<T>- এবং না, সম্মিলন এই রূপান্তরকে অনুমতি দেবে না , কারণ এটি অনিরাপদ হবে - আমার উত্তর দেখুন।
জন স্কিটি

আপনি যে পৃষ্ঠাটিতে লিঙ্ক করেছেন: "কেবলমাত্র ইন্টারফেসের ধরণের এবং প্রতিনিধিদের ধরণের বৈকল্পিক ধরণের প্যারামিটার থাকতে পারে"
জন স্কিটি

@ জন - আমি ToList()আপনার মন্তব্যটি পড়ার আগে বুঝতে পারছিলাম যে এটি অনুপস্থিত ছিল; তবে হ্যাঁ আপনি অবশ্যই দেখিয়েছেন Covariance কাজ করবে না! ডোহ!
আন্দ্রেস জোল্টান

ঠিক। কোভারিয়েন্স এখনও সহায়তা করতে পারে, কারণ এর অর্থ আপনার কাছে Castনেট নেট 4 এ কল করার দরকার নেই , যতক্ষণ আপনি টাইপ যুক্তিটি নির্দিষ্ট করেন ToList
জন স্কিটি

5

আমারও এই সমস্যা হয়েছিল এবং জন স্কিটির উত্তর পড়ার পরে আমি আমার কোডটি List<T>ব্যবহারের ব্যবহার থেকে পরিবর্তন করেছি IEnumerable<T>। যদিও এই ওপি মূল প্রশ্নের উত্তর না আমি কিভাবে কাস্ট করতে পারেন List<Client>থেকেList<IDic> , এটা তা করার প্রয়োজন এড়ানো না এবং এইভাবে যারা অন্যদের এই সমস্যা সম্মুখীন করার জন্য সহায়ক হতে পারে। এটি অবশ্যই ধরে নিয়েছে যে কোডটি ব্যবহারের প্রয়োজন তা List<IDic>আপনার নিয়ন্ত্রণে রয়েছে।

উদাহরণ:

public void ProcessIDic(IEnumerable<IDic> sequence)
{
   // Implementation
}

পরিবর্তে:

public void ProcessIDic(List<IDic> list)
{
   // Implementation
}

3

আপনি যদি লিনিকিউ ব্যবহার করতে পারেন তবে আপনি এটি করতে পারেন ...

List<Client> clientList = new List<Client>();
List<IDic> list = clientList.Select(c => (IDic)c).ToList();


0

নতুন তৈরি List<IDic>এবং সমস্ত উপাদান স্থানান্তর করে এটিই সম্ভব ।


কোনও মন্তব্য কেন হ্রাস পেয়েছে, যেহেতু সাধারণ অর্থ অন্যান্য উত্তরগুলির সাথে একই?
পিয়োটার অগুস্কিক

আমার ধারণা আপনি নিচু হয়ে উঠবেন কারণ আপনি বলেছিলেন যে কেবলমাত্র একটি নতুন তালিকা তৈরি করা সম্ভব হয়েছিল, তবে অন্যরা তার বিপরীতে পোস্ট করেছেন ... যদিও আমার ডাউনটোট নেই)
musefan

ভাল তারা নতুন তালিকা তৈরি করে তবে নতুন অপারেটর দিয়ে নয় যা তারা করে এমন সত্যের পরিবর্তন করে না।
পিয়োটার অগুস্কিক

0

নেট নেট 3.5 এ, আপনি নিম্নলিখিতগুলি করতে পারেন:

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());

এই ক্ষেত্রে তালিকার জন্য কনস্ট্রাক্টর একটি আইনিউমারেবল লাগে।
তালিকাটি কেবল আইএনউমারেবলের ক্ষেত্রে রূপান্তরযোগ্য। যদিও MyObj ISomeInterface এ রূপান্তরযোগ্য হতে পারে তবে IEnumerable টাইপটি IEnumerable তে রূপান্তরযোগ্য নয়।


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