कल मैंने इस अजीब मामले में ठोकर खाई, जहां t as D
एक गैर-शून्य मान देता है, लेकिन (D)t
एक कंपाइलर त्रुटि का कारण बनता है।यह एक्स अमान्य क्यों है जब 'x as y` ठीक काम करता है?
के बाद से मैं जल्दी मैं सिर्फ t as D
का इस्तेमाल किया और आगे बढ़ाया में था, लेकिन मैं, क्यों डाली अमान्य है के बारे में उत्सुक हूँ के रूप में t
वास्तव में एक D
है। क्या किसी ने कुछ प्रकाश डाला है कि संकलक को कास्ट पसंद नहीं है?
class Program
{
public class B<T> where T : B<T> { }
public class D : B<D> { public void M() { Console.Out.WriteLine("D.M called."); } }
static void Main() { M(new D()); }
public static void M<T>(T t) where T : B<T>
{
// Works as expected: prints "D.M called."
var d = t as D;
if (d != null)
d.M();
// Compiler error: "Cannot cast expression of type 'T' to type 'D'."
// even though t really is a D!
if (t is D)
((D)t).M();
}
}
संपादित करें: आसपास बजाना, मुझे लगता है कि यह एक स्पष्ट उदाहरण है। दोनों मामलों में t
B
होने के लिए बाध्य है और शायद D
है। लेकिन जेनेरिक के साथ मामला संकलित नहीं होगा। क्या सी # केवल सामान्य बाधा को अनदेखा करता है जब यह निर्धारित करता है कि कास्ट कानूनी है या नहीं? भले ही यह इसे अनदेखा करता है, t
अभी भी D
हो सकता है; तो यह रनटाइम अपवाद के बजाय संकलन समय त्रुटि क्यों है?
class Program2
{
public class B { }
public class D : B { public void M() { } }
static void Main()
{
M(new D());
}
public static void M(B t)
{
// Works fine!
if (t is D)
((D)t).M();
}
public static void M<T>(T t) where T : B
{
// Compile error!
if (t is D)
((D)t).M();
}
}
शर्त '(डी) (ऑब्जेक्ट) t' काम करता है –
संभावित डुप्लिकेट [प्रकार 'टी' का मूल्य परिवर्तित नहीं किया जा सकता है] (http://stackoverflow.com/questions/4092393/value-of-type-t-cannot-be-converted- करने के लिए) –
[इस लिंक] में एक टिप्पणी से (http://stackoverflow.com/questions/1613314/generic-type-casting-method-net) मुझे [आपके उत्तर] का एक लिंक मिला (http: // bl ogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx)। अनिवार्य रूप से, कुछ परिवर्तनीय प्रकार हैं जिन्हें अन्य प्रकारों में नहीं डाला जा सकता है (अधिक विशेष रूप से बॉक्सिंग प्रकारों को कास्टिंग करने के नियम हैं)। चूंकि संकलक को इस बारे में कोई जानकारी नहीं है कि टी संकलन समय पर क्या है, इसे इसे सुरक्षित रखना और कलाकारों से इनकार करना है। –