Ho una situazione in cui mi piacerebbe che il comportamento del compilatore fosse spiegato. Dato un po 'di codice:La parola chiave Sealed influenza l'opinione del compilatore su un cast
interface IFoo<T>
{
T Get();
}
class FooGetter : IFoo<int>
{
public int Get()
{
return 42;
}
}
I seguenti compilato ed eseguito:
static class FooGetterGetter
{
public static IFoo<T> Get<T>()
{
return (IFoo<T>)new FooGetter();
}
}
Se facciamo una modifica alla firma della classe Foo
e aggiungere la parola chiave sealed
:
sealed class FooGetter : IFoo<int> // etc
Quindi viene visualizzato un errore del compilatore nella seguente riga:
return (IFoo<T>)new FooGetter();
Di:
Impossibile convertire il tipo 'MyNamespace.FooGetter' a 'MyNamespace.IFoo <T>'
Qualcuno può spiegare che cosa sta accadendo qui per quanto riguarda la parola chiave sealed
? Questo è il C# 4 contro un progetto .NET 4 in Visual Studio 2010.
Aggiornamento: abbastanza interessante mi sono imbattuto in quella parte del comportamento quando mi chiedevo perché il seguente codice corregge quando viene applicata sealed
:
return (IFoo<T>)(IFoo<int>)new FooGetter();
Aggiornamento: solo per un chiarimento, tutto funziona bene quando il tipo di T
richiesto è lo stesso come il tipo di T
utilizzato dal tipo concreto. Se i tipi sono diversi, il cast non riesce a runtime con qualcosa di simile:
Impossibile eseguire il cast oggetto di tipo 'MyNamespace.StringFoo' di digitare 'MyNamespace.IFoo`1 [System.Int32]'
Nell'esempio sopra, StringFoo : IFoo<string>
e il chiamante chiede di ottenere uno int
.
Non ho la risposta, ma immagino che ha qualcosa a che fare con il fatto che '' IFoo è un tipo generico aperta mentre 'attrezzi FooGetter' 'IFoo ' che è un tipo generico chiuso. –
Solo una nota: mi sono assicurato che avessi definito il comportamento prima di postare la domanda - non volevo prendere in giro me stesso :-) Posso capire perché potrebbe essere permesso, il compilatore non può garantire cosa sta succedendo, solo sa che ha una possibilità di successo. Ma per qualche ragione, rimuove la stessa possibilità di successo quando la parola chiave sigillata è presente a causa del presupposto che, poiché non può essere derivata, non può corrispondere a T. –
+1 Interessante :) – leppie