2012-08-31 16 views
5

ist möglich Schnittstelle der folgenden kompilieren, ohne zu machen:generischen Typ Cast Typeinschränkung

  1. machen IFooCollection generic
  2. Explizit IFooCollection.Items auf FooCollection und Durchführung eine explizite Umwandlung zu implementieren.

public interface IFoo 
{ 

} 

public interface IFooCollection 
{ 
    IEnumerable<IFoo> Items { get; } 
} 

public class FooCollection<T> : IFooCollection where T : IFoo 
{ 
    public IEnumerable<T> Items { get; set; } 
} 

Ich bin glücklich genug, um mit der zweiten Lösung (Implementierung der Schnittstelle explizit), möchte aber verstehen, warum ich brauche T als IFoo zu werfen, wenn wir eine generische Einschränkung haben angeben, dass T Muss implementieren IFoo.

Antwort

9

Der Grund ist folgender:

IFooCollection.Items jede Klasse enthalten kann, die IFoo implementiert. So kann es FooA, FooB, FooC zur gleichen Zeit enthalten.

FooCollection<FooA>.Items können andererseits nur Elemente vom Typ FooA enthalten. Der Versuch, FooB oder FooC zu FooA zu werfen würde InvalidCastException ergeben, obwohl alle IFoo implementieren.