Tengo una situación en la que me gustaría explicar el comportamiento del compilador. Teniendo en cuenta un poco de código:La palabra clave sellada afecta la opinión del compilador sobre un molde
interface IFoo<T>
{
T Get();
}
class FooGetter : IFoo<int>
{
public int Get()
{
return 42;
}
}
Los siguientes compila y ejecuta:
static class FooGetterGetter
{
public static IFoo<T> Get<T>()
{
return (IFoo<T>)new FooGetter();
}
}
Si hacemos un cambio a la firma de la clase Foo
y añadir la sealed
palabra clave:
sealed class FooGetter : IFoo<int> // etc
Entonces obtengo un error de compilación en la siguiente línea:
return (IFoo<T>)new FooGetter();
de:
No se puede convertir tipo 'MyNamespace.FooGetter' a 'MyNamespace.IFoo <T>'
Puede alguien explicar lo que está sucediendo aquí con respecto a la palabra clave sealed
? Esto es C# 4 en contra de un proyecto .NET 4 en Visual Studio 2010.
Actualización: curiosamente me encontré con esa parte del comportamiento cuando me preguntaba por qué el código siguiente corrige cuando se aplica sealed
:
return (IFoo<T>)(IFoo<int>)new FooGetter();
actualización: sólo para aclarar, todo funciona muy bien cuando el tipo de T
solicitado es el mismo que el tipo de T
utilizado por el tipo de hormigón. Si los tipos son diferentes, la conversión falla en tiempo de ejecución con algo como:
No se puede convertir objeto de tipo 'MyNamespace.StringFoo' para escribir 'MyNamespace.IFoo`1 [System.Int32]'
En el ejemplo anterior, StringFoo : IFoo<string>
y la persona que llama solicita obtener un int
.
no tengo la respuesta, pero me imagino que tiene algo que ver con el hecho de que '' IFoo es un tipo genérico abierto mientras que 'implementos FooGetter' 'IFoo ' que es un tipo genérico cerrado. –
Solo una nota: me aseguré de tener el comportamiento definido antes de publicar la pregunta, no quería hacer el ridículo :-) Puedo ver por qué se puede permitir, el compilador no puede garantizar lo que está pasando, solo sabe que tiene posibilidades de éxito. Pero por alguna razón, elimina esa misma posibilidad de éxito cuando la palabra clave sellada está presente debido a que supone que, como no se puede derivar, no puede coincidir con T. –
+1 Interesante :) – leppie