Ich fragte this question. Dieser Code lässt sich nicht kompilieren („Kann nicht konvertieren Generic<T>
-T
“), weil der Grund here erklärt (auch wenn ich einen InvalidCastException
zur Laufzeit erwarten würden statt ein Fehler bei der Kompilierung).Unerwartete Verhalten von "as" -Operator, es unterscheidet sich von Normalform
class NonGeneric
{
}
class Generic<T> : NonGeneric
where T : NonGeneric
{
T DoSomething()
{
return (T)this; // ** Cannot convert...
}
}
akzeptierte Lösung gab diese Abhilfe:
T DoSomething()
{
return this as T;
}
Meine Frage ist: warum? as
Operator sollte exakt gleich wie Operator zu sein:
Der as-Operator ist wie ein Cast-Vorgang. Wenn die Konvertierung jedoch nicht möglich ist, wird null zurückgegeben, anstatt eine Ausnahme auszulösen.
Wenn this as T
zu this is T? (T)this: (T)null
gleichwertig sein sollte, warum dann as T
Werke und (T)this
nicht einmal kompilieren? AFAIK Guss konnte in einer Vielzahl von Situationen als as
verwendet werden:
Beachten Sie, dass die als Operator führt nur Referenz Conversions, Nullable-Conversions und Boxen Konvertierungen. Der as-Operator kann keine anderen Konvertierungen ausführen, z. B. benutzerdefinierte Konvertierungen, die stattdessen mithilfe von Cast-Ausdrücken durchgeführt werden sollten.
Dann warum? Ist es eine dokumentierte Funktion von as
Operator? Ist es eine Compiler-/Sprachbeschränkung mit generischen Typen? Beachten Sie, dass dieser Code kompiliert fein:
return (T)((object)this);
Ist dies, weil Compiler nicht sicher sein kann, wenn T
ist dynamic
(auch wenn es eine where
Einschränkung ist), dann wird es immer einen solchen Code generieren?
Der Kompilierungsfehler besagt, dass Sie "NonGeneric" erben. Ist der Compiler verwirrt oder ist das Codebeispiel ungenau? –
Gibt die 'DoSomething()' Funktion ein 'T' Objekt oder' null' zurück? –
@KeithPayne Entschuldigung, falsche Fehlermeldung. behoben –