¿Por qué no puedo convertir un Foo a IFoo

¿Por qué no puedo convertir un Foo a IFoo .

Si lo bash me sale:

No hay conversión de referencia implícita de Foo a IFoo

Funcionaría si estuvieras usando C # 4 e IFoo se declarara como:

 public interface IFoo 

asumiendo que Bar implementa IBar y Foo implementa IFoo .

Sin embargo, solo podría ser declarado de esa manera si fuera seguro. No es seguro si T valores de T “entran” en la API y salen. Por ejemplo:

 public interface IFoo { T Value { get; set; } } 

Esto no puede ser covariante en T, ya que de lo contrario podría escribir:

 public class StringFoo : IFoo { public T Value { get; set; } } IFoo fooString = new StringFoo(); // That's fine IFoo fooObject = fooString; // This isn't, because... fooObject.Value = new Object(); // ... this would violate type safety 

Lea la larga serie de blogs de Eric Lippert sobre la variación genérica para obtener mucha más información.

Para que esto funcione, tres cosas deben ser ciertas:

  1. Bar debe implementar IBar
  2. Foo debe implementar IFoo
  3. IFoo debe ser covariante en T (como esto: IFoo )

Depende de la versión de C # con la que esté comstackndo.

La covarianza genérica y la contravarianza se introdujeron con C # y .NET 4: http://msdn.microsoft.com/en-us/library/dd799517.aspx