2012-08-31 11 views
5

Czy jest możliwe, aby wprowadzić następujące skompilować bez:Obsada typu rodzajowego do interfejsu typu ograniczenie

  1. Making IFooCollection generic
  2. Jawnie wykonawczych IFooCollection.Items na FooCollection i wykonywania wyraźny odcień.

public interface IFoo 
{ 

} 

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

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

Jestem dość zadowolony z drugiego rozwiązania (wdrożenie interfejsu jawnie), ale chciałbym zrozumieć, dlaczego muszę rzucać T jak IFoo kiedy mamy ogólne ograniczenia określające, że T koniecznością implementuj IFoo.

Odpowiedz

9

Powód jest następujący:

IFooCollection.Items może zawierać dowolną klasę, która realizuje IFoo. Może on jednocześnie zawierać FooA, FooB, , .

FooCollection<FooA>.Items z drugiej strony może zawierać tylko elementy typu FooA. Próba oddania FooB lub FooC doprzyniosłaby InvalidCastException, mimo że wszystkie narzędzia IFoo.

Powiązane problemy