Nur aus Neugier, warum behandelt der Compiler eine unbeschränkte generische Art anders als es typeof (Objekt) würde?Die Regeln von Generika und Typ Einschränkungen
In den oben genannten, Casting "T Ding" zu Bar führt zu einem Compiler-Fehler. Das "Objekt-Ding" zu Bar zu bringen, ist etwas, was der Compiler mir erlaubt, natürlich auf mein eigenes Risiko.
Was ich nicht sehe, ist warum. In .net-Objekt nach allem ist ein Catch-All und der Laufzeittyp könnte ein Boxed-Wert oder ein Objekt eines beliebigen Typs sein. Ich sehe also nicht, welchen logischen Grund es für den Compiler gibt, zwischen den beiden Fällen zu unterscheiden. Das Beste, was ich tun kann, ist so etwas wie "Der Programmierer würde erwarten, dass der Compiler Typtests mit generischen Typen durchführt, aber nicht mit Objekten". :) Ist das alles da?
Btw, ich bin mir bewusst, dass ich immer noch meine Besetzung im Foo Fall durch einfaches Schreiben erledigen
((Bar)(object)thing).ToString();
Ich möchte nur verstehen, warum die Compiler dies tun ...
Ist die Kompilierzeit legal, um 'int' in' Bar' zu übertragen? Wenn Sie diesen Typparameter mit 'int' ausfüllen, sollte * dann * Compilerfehler auftreten? Was ist, wenn die Baugruppe nicht von Ihnen stammt, sodass Sie das Problem nicht sehen können? T ist kein Objekt. Es ist etwas unglaublich Spezifisches. –
Ist dir auch bekannt, dass du sagen kannst "Klasse Foo wo T: Bar" zu _ensure_ dass "T" immer in "Bar" umgewandelt werden kann? –
Rawling
Ich bin sicher, dass Eric Lippert irgendwo einen Blogeintrag darüber hat, aber ich finde es nicht ... –