সুইকের বক্তব্য যুক্ত করতে:
কারণ কেন castালাই
var listOfX = new List<X>();
ListOf<Y> ys = (List<Y>)listOfX; // Compile error: Cannot implicitly cast X to Y
সম্ভব নয় কারণ List<T>
হল প্রকার টি মধ্যে পরিবর্তিত এবং এইভাবে এটি কিনা কোন ব্যাপার না X
থেকে আহরিত Y
) - এর কারণ List<T>
হিসেবে সংজ্ঞায়িত করা হয়:
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T> ... // Other interfaces
(দ্রষ্টব্য যে এই ঘোষণাপত্রে, T
এখানে টাইপ করুন কোনও অতিরিক্ত বৈকল্পিক সংশোধক নেই)
তবে আপনার ডিজাইনে যদি পরিবর্তনীয় সংগ্রহের প্রয়োজন হয় না, তবে অনেকগুলি অপরিবর্তনীয় সংগ্রহের উপরে একটি আপকাস্ট সম্ভব , যেমন প্রদত্ত যেগুলি Giraffe
থেকে প্রাপ্ত Animal
:
IEnumerable<Animal> animals = giraffes;
এটি কারণে IEnumerable<T>
কোভেরিয়েন্সকে সমর্থন করে T
- এটি এই অর্থে IEnumerable
বোঝায় যে এই সংগ্রহটি পরিবর্তন করা যায় না, যেহেতু সংগ্রহ থেকে উপাদানগুলি যুক্ত বা সরানোর পদ্ধতিগুলির কোনও সমর্থন নেই। out
এর ঘোষণায় কীওয়ার্ডটি নোট করুন IEnumerable<T>
:
public interface IEnumerable<out T> : IEnumerable
( কেন পরিবর্তনীয় সংগ্রহগুলি যেমন সমর্থন করতে পারে না তার কারণের জন্য এখানে আরও ব্যাখ্যা দেওয়া হয়েছে , যেখানে অপরিবর্তনীয় পুনরাবৃত্তকারী এবং সংগ্রহগুলি পারে))List
covariance
সাথে কাস্টিং .Cast<T>()
অন্যরা যেমন উল্লেখ করেছে, .Cast<T>()
টি তে নষ্ট হওয়া উপাদানগুলির একটি নতুন সংগ্রহের প্রকল্পের জন্য কোনও সংকলনের ক্ষেত্রে প্রয়োগ করা যেতে পারে, তবে এটি করার ফলে InvalidCastException
এক বা একাধিক উপাদানের উপর castালাই সম্ভব না হলে (যা স্পষ্ট করে দেওয়ার মতো আচরণ হবে) ওপির foreach
লুপে কাস্ট করুন )।
ফিল্টারিং এবং সাথে কাস্টিং OfType<T>()
যদি ইনপুট তালিকায় বিভিন্ন, incompatable ধরণের উপাদান থাকে তবে এর পরিবর্তে InvalidCastException
ব্যবহার করে সম্ভাব্যতা এড়ানো যায় । ( রূপান্তর করার চেষ্টা করার আগে কোনও উপাদানকে টার্গেটের ধরণের রূপান্তর করা যায় কিনা তা পরীক্ষা করে দেখুন এবং অবিচ্ছিন্ন প্রকারের ফিল্টার আউট করতে পারেন)).OfType<T>()
.Cast<T>()
.OfType<>()
প্রতিটির জন্য
এছাড়াও মনে রাখবেন যদি ওপি পরিবর্তে লিখেছিলাম: (নোট স্পষ্টY y
মধ্যে foreach
)
List<Y> ListOfY = new List<Y>();
foreach(Y y in ListOfX)
{
ListOfY.Add(y);
}
theালাইও চেষ্টা করা হবে যে। তবে, যদি কোনও কাস্ট সম্ভব না হয় তবে একটি InvalidCastException
ফলাফল হবে result
উদাহরণ
উদাহরণস্বরূপ, সরল (সি # 6) শ্রেণি শ্রেণিবিন্যাস দেওয়া হয়েছে:
public abstract class Animal
{
public string Name { get; }
protected Animal(string name) { Name = name; }
}
public class Elephant : Animal
{
public Elephant(string name) : base(name){}
}
public class Zebra : Animal
{
public Zebra(string name) : base(name) { }
}
মিশ্র প্রকারের সংগ্রহের সাথে কাজ করার সময়:
var mixedAnimals = new Animal[]
{
new Zebra("Zed"),
new Elephant("Ellie")
};
foreach(Animal animal in mixedAnimals)
{
// Fails for Zed - `InvalidCastException - cannot cast from Zebra to Elephant`
castedAnimals.Add((Elephant)animal);
}
var castedAnimals = mixedAnimals.Cast<Elephant>()
// Also fails for Zed with `InvalidCastException
.ToList();
যেখানে:
var castedAnimals = mixedAnimals.OfType<Elephant>()
.ToList();
// Ellie
কেবলমাত্র হাতিগুলিকে ফিল্টার করে - অর্থাত্ জেব্রাগুলি মুছে ফেলা হয়।
পুনরায়: অন্তর্ভুক্ত কাস্ট অপারেটররা
ডায়নামিক ব্যতীত, ব্যবহারকারী সংজ্ঞায়িত রূপান্তর অপারেটরগুলি কেবল সংকলন সময় * এ ব্যবহৃত হয় , সুতরাং জেব্রা এবং এলিফ্যান্টের মধ্যে রূপান্তরকারী অপারেটরটি উপলব্ধ করা হলেও, রূপান্তরকরণের পদ্ধতির উপরের রান টাইম আচরণটি পরিবর্তিত হবে না।
যদি আমরা একটি জেব্রাটিকে একটি এলিফ্যান্টে রূপান্তর করতে কোনও রূপান্তর অপারেটর যুক্ত করি:
public class Zebra : Animal
{
public Zebra(string name) : base(name) { }
public static implicit operator Elephant(Zebra z)
{
return new Elephant(z.Name);
}
}
পরিবর্তে, উপরে রূপান্তর অপারেটর দেওয়া কম্পাইলার অ্যারের নীচের থেকে ধরণ পরিবর্তন করতে সক্ষম হবে Animal[]
থেকে Elephant[]
দেওয়া যে Zebras এখন হাতি একটি সজাতি সংগ্রহ রূপান্তরিত করা যেতে পারে:
var compilerInferredAnimals = new []
{
new Zebra("Zed"),
new Elephant("Ellie")
};
রান সময় ইম্পিলেটিভ রূপান্তর অপারেটর ব্যবহার
* এরিকের হিসাবে উল্লেখ করা হয়েছে, রূপান্তর অপারেটর অবশ্য চালুর সময় অবলম্বন করে অ্যাক্সেস করা যেতে পারে dynamic
:
var mixedAnimals = new Animal[] // i.e. Polymorphic collection
{
new Zebra("Zed"),
new Elephant("Ellie")
};
foreach (dynamic animal in mixedAnimals)
{
castedAnimals.Add(animal);
}
// Returns Zed, Ellie