public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
আমি কিভাবে কাস্ট করতে পারেন List<Client>
করতে List<IDic>
?
public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
আমি কিভাবে কাস্ট করতে পারেন List<Client>
করতে List<IDic>
?
উত্তর:
আপনি এটিকে কাস্ট করতে পারবেন না (রেফারেন্স পরিচয় সংরক্ষণ করুন) - এটি অনিরাপদ। উদাহরণ স্বরূপ:
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ালাইয়ের মতো নয় - কারণ এখন দুটি পৃথক তালিকা রয়েছে। এটি নিরাপদ, তবে আপনাকে বুঝতে হবে যে একটি তালিকায় করা পরিবর্তনগুলি অন্য তালিকায় দেখা যাবে না । ( তালিকাগুলি উল্লিখিত অবজেক্টগুলির পরিবর্তন অবশ্যই দেখা যাবে))
List<IFruit>
একটি রেফারেন্স ছিল যা আসলে একটি এর রেফারেন্স ছিল List<Apple>
। আপনি যদি এর সাথে একটি Banana
রেফারেন্স যুক্ত করেন তবে আপনি কী হওয়ার আশা করবেন List<IFruit>
?
using
জন্য নির্দেশ System.Linq
, বা কি আপনি এটা কল করার চেষ্টা করছেন আমি নিশ্চিত তুমি আমাকে কিভাবে সাহায্য করতে সক্ষম হতে আশা নই। আমি আপনাকে আরও গবেষণা করার পরামর্শ দিচ্ছি এবং যদি আপনি এখনও আটকে থাকেন তবে আপনি একটি ন্যূনতম প্রজননযোগ্য উদাহরণ সহ একটি প্রশ্ন জিজ্ঞাসা করুন ।
একটি কাস্ট পুনরুক্তি এবং। টোললিস্ট ():
List<IDic> casted = input.Cast<IDic>().ToList()
কৌতুক করবে
মূলত আমি বলেছিলাম যে সমবায় কাজ করবে - তবে জন ঠিক যেমন উল্লেখ করেছেন; না এটা হবে না!
এবং মূলত আমিও বোকামিভাবে ToList()
কলটি ছেড়ে দিয়েছি
Cast
একটি IEnumerable<T>
না List<T>
- এবং না, সম্মিলন এই রূপান্তরকে অনুমতি দেবে না , কারণ এটি অনিরাপদ হবে - আমার উত্তর দেখুন।
ToList()
আপনার মন্তব্যটি পড়ার আগে বুঝতে পারছিলাম যে এটি অনুপস্থিত ছিল; তবে হ্যাঁ আপনি অবশ্যই দেখিয়েছেন Covariance কাজ করবে না! ডোহ!
Cast
নেট নেট 4 এ কল করার দরকার নেই , যতক্ষণ আপনি টাইপ যুক্তিটি নির্দিষ্ট করেন ToList
।
আমারও এই সমস্যা হয়েছিল এবং জন স্কিটির উত্তর পড়ার পরে আমি আমার কোডটি List<T>
ব্যবহারের ব্যবহার থেকে পরিবর্তন করেছি IEnumerable<T>
। যদিও এই ওপি মূল প্রশ্নের উত্তর না আমি কিভাবে কাস্ট করতে পারেন List<Client>
থেকেList<IDic>
, এটা তা করার প্রয়োজন এড়ানো না এবং এইভাবে যারা অন্যদের এই সমস্যা সম্মুখীন করার জন্য সহায়ক হতে পারে। এটি অবশ্যই ধরে নিয়েছে যে কোডটি ব্যবহারের প্রয়োজন তা List<IDic>
আপনার নিয়ন্ত্রণে রয়েছে।
উদাহরণ:
public void ProcessIDic(IEnumerable<IDic> sequence)
{
// Implementation
}
পরিবর্তে:
public void ProcessIDic(List<IDic> list)
{
// Implementation
}
List<Client> listOfA = new List<Client>();
List<IDic> list = listOfA.Cast<IDic>().ToList();
নতুন তৈরি List<IDic>
এবং সমস্ত উপাদান স্থানান্তর করে এটিই সম্ভব ।
নেট নেট 3.5 এ, আপনি নিম্নলিখিতগুলি করতে পারেন:
List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());
এই ক্ষেত্রে তালিকার জন্য কনস্ট্রাক্টর একটি আইনিউমারেবল লাগে।
তালিকাটি কেবল আইএনউমারেবলের ক্ষেত্রে রূপান্তরযোগ্য। যদিও MyObj ISomeInterface এ রূপান্তরযোগ্য হতে পারে তবে IEnumerable টাইপটি IEnumerable তে রূপান্তরযোগ্য নয়।