कास्टिंग और टाइप कन्वर्ज़न, किसी एक्सप्रेशन को एक डेटा टाइप से दूसरे डेटा टाइप में बदलने के दो अलग-अलग तरीके हैं।
किसी एक्सप्रेशन को कास्ट ऑपरेटर (<type>) की मदद से दूसरे टाइप में कास्ट किया जा सकता है।
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
अगर टाइप आपस में कंपैटिबल नहीं हैं, तो InvalidCastException का एक इंस्टेंस फेंका जाता है। संख्याओं के मामले में इसका मतलब है कि जिस टाइप में कास्ट किया जा रहा है, वह कास्ट की गई वैल्यू को दर्शा नहीं सकता। क्लास के मामले में, दोनों टाइप में से एक का दूसरे से व्युत्पन्न होना ज़रूरी है (यही बात स्ट्रक्ट पर भी सीधे लागू होती है)।
कास्टिंग का एक विकल्प है टाइप कन्वर्ज़न, जिसमें is ऑपरेटर का इस्तेमाल किया जाता है। यह आमतौर पर रेफरेंस और नलएबल टाइप पर लागू होता है।
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
अगर आपको किसी ऑब्जेक्ट का ठीक-ठीक टाइप पता लगाना है, तो is ज़रूरत से ज़्यादा ढीला पड़ सकता है, क्योंकि यह किसी क्लास के लिए और उन सभी क्लासों तथा इंटरफेस के लिए भी सही लौटाता है जिनसे वह सीधे या परोक्ष रूप से व्युत्पन्न है। ऐसे मामलों में typeof और Object.GetType() ही हल हैं।
object o = new List<int>();
o is ICollection<int> // true
o.GetType() == typeof(ICollection<int>) // false
o is List<int> // true
o.GetType() == typeof(List<int>) // true
हमारा फुटबॉल क्लब football-match-reports लीग में लगातार आगे बढ़ रहा है, और आपको एक बार फिर कुछ काम करने का मौका दिया गया है, इस बार सिक्योरिटी पास प्रिंट करने की प्रणाली पर।
सहायक स्टाफ का क्लास पदानुक्रम इस प्रकार है
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
इस पदानुक्रम का पूरा कार्यान्वयन अभ्यास के सोर्स कोड के हिस्से के रूप में दिया गया है।
सिक्योरिटी पास बनाने वाले को दिया गया सारा डेटा जाँच लिया गया है और वह null नहीं होगा, इसकी गारंटी है।
कृपया SecurityPassMaker.GetDisplayName() मेथड लागू कीजिए। इसे Staff से बनी सभी क्लासों के इंस्टेंस के Title फील्ड की वैल्यू लौटानी चाहिए, और बाकी मामलों में "Too Important for a Security Pass" लौटाना चाहिए।
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Manager());
// => "Too Important for a Security Pass"
spm.GetDisplayName(new Physio());
// => "The Physio"
कृपया SecurityPassMaker.GetDisplayName() मेथड में बदलाव कीजिए। इसे टास्क 1 की तरह ही काम करना चाहिए। फर्क सिर्फ इतना है कि अगर स्टाफ सदस्य सिक्योरिटी टीम का हिस्सा हो (यानी उसका टाइप Security हो या उससे बनी कोई क्लास), तो टाइटल के बाद " Priority Personnel" टेक्स्ट दिखना चाहिए।
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Physio());
// => "The Physio"
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior Priority Personnel"
कृपया SecurityPassMaker.GetDisplayName() मेथड में बदलाव कीजिए। इसे टास्क 2 की तरह ही काम करना चाहिए। फर्क सिर्फ इतना है कि SecurityJunior, SecurityIntern और PoliceLiaison टाइप के इंस्टेंस के लिए " Priority Personnel" टेक्स्ट नहीं दिखना चाहिए।
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।