मान लीजिए मैं एक सामान्य विधि है:कास्टिंग CS0030 क्यों देता है, जबकि "जैसा" काम करता है?
T Foo(T x) {
return x;
}
अब तक तो अच्छा। लेकिन अगर मैं हैशटेबल हूं तो मैं कुछ खास करना चाहता हूं। (मैं जानता हूँ कि यह एक पूरी तरह से काल्पनिक उदाहरण है। Foo()
एक बहुत ही रोमांचक विधि, या तो नहीं है। साथ खेलते हैं।)
if (typeof(T) == typeof(Hashtable)) {
var h = ((Hashtable)x); // CS0030: Cannot convert type 'T' to 'System.Collections.Hashtable'
}
अरे। निष्पक्ष होने के लिए, हालांकि, मैं वास्तव में यह नहीं बता सकता कि यह कानूनी सी # होना चाहिए या नहीं। खैर, अगर मैं इसे अलग तरीके से करने की कोशिश करता हूं तो क्या होगा?
if (typeof(T) == typeof(Hashtable)) {
var h = x as Hashtable; // works (and no, h isn't null)
}
यह थोड़ा अजीब है। एमएसडीएन के अनुसार, expression as Type
है (अभिव्यक्ति को दो बार मूल्यांकन करने के अलावा) expression is type ? (type)expression : (type)null
जैसा ही है।
यदि मैं दस्तावेज़ों से समकक्ष अभिव्यक्ति का उपयोग करने का प्रयास करता हूं तो क्या होता है?
if (typeof(T) == typeof(Hashtable)) {
var h = (x is Hashtable ? (Hashtable)x : (Hashtable)null); // CS0030: Cannot convert type 'T' to 'System.Collections.Hashtable'
}
कास्टिंग और as
कि मैं देख रहा हूँ है के बीच केवल प्रलेखित अंतर "as
ऑपरेटर केवल संदर्भ के रूपांतरण और मुक्केबाजी रूपांतरण करता है"। शायद मुझे यह बताना होगा कि मैं संदर्भ प्रकार का उपयोग कर रहा हूं?
T Foo(T x) where T : class {
var h = ((Hashtable)x); // CS0030: Cannot convert type 'T' to 'System.Collections.Hashtable'
return x;
}
क्या चल रहा है? as
क्यों ठीक काम करता है, जबकि कास्टिंग भी संकलित नहीं होगा? क्या कास्ट काम करना चाहिए, या as
काम नहीं करना चाहिए, या क्या कास्टिंग और as
के बीच कुछ अन्य भाषा अंतर है जो मुझे मिले एमएसडीएन दस्तावेज़ों में नहीं है?
मुझे पूरा यकीन है कि एमएसडीएन से उद्धृत वाक्य जेनेरिक से पहले अस्तित्व में था। –
फिर भी, अगर यह सब कुछ है ... निश्चित रूप से दिलचस्प सवाल! – Blindy
क्या यह एक डुप्ली है, या सिर्फ निकट से संबंधित है: http://stackoverflow.com/questions/884315/how-to-up-cast-to-a-generic-object? –