Quando si tenta di utilizzare la parola chiave C# "come" su un tipo non generico a cui non è possibile eseguire il cast, il compilatore dà un errore che il tipo non può essere convertito.Comportamento in conflitto durante la compilazione utilizzando come parola chiave i tipi generici in C#
Tuttavia quando si utilizza il "come" parola chiave nei confronti di un tipo generico il compilatore dà nessun errore:
public class Foo { }
public class Bar<T> { }
public class Usage<T> {
public void Test() {
EventArgs args = new EventArgs();
var foo = args as Foo; // Compiler Error: cannot convert type
var bar = args as Bar<T>; // No compiler error
}
}
ho scoperto questo comportamento in una base di codice molto più grande dove la mancanza di un errore di compilazione ha portato a un problema in fase di runtime.
Il comportamento in conflitto è di progettazione? In tal caso, qualcuno ha qualche idea del perché?
FYI: R # fa la bandiera con l'avvertenza "getto sospetto: non v'è alcun tipo nella soluzione che è ereditato sia da "EventArgs" che da "Bar" " –
juharr
@juharr grazie! Immagino che vada a dimostrare che il problema è rilevabile in C#. Ho anche ricontrollato il problema con il compilatore F # che come R # preleva il cast non valido (ma nel caso di F # è contrassegnato come errore) –