2009-07-23 3 views
0

Я пытаюсь сделать следующее:Смесь типов в общем списке

List<IRepository<IBusinessObject, ICriteria>> Repositories { get; } 

и называю это по

IRepository<ICustomer, ICustomerCriteria> cr = new CustomerRepository(); 

List.Add(CustomerRepository); 

где ICustomer и ICustomerCriteria спускаются с IBusinessObject и ICriteria соответственно.

Однако компилятору это не нравится.

Хммм, я знаю, что я немного подтолкнул его, но я думал, что это сработает? Кто-нибудь знает, почему?

Благодаря Дункан

ответ

1

Это generic variance проблема:

Это проиллюстрирует вопрос:

List<string> Strings = ...; 
List<object> Objects = Strings; // Should work 

Objects.Add(42); // 42 is an object - Should work 
// But we would add an integer into a list of strings!! 

В .NET FX 4, C# будет поддерживать особый вид in и out общих параметров, чтобы позволить правильное поведение.

+0

Хорошо, но мой объектный график звучит - ICustomer спускается из IBusinessObject, поэтому я до сих пор не вижу проблемы! Хм ... какие-нибудь рекомендуемые обходные пути? – Duncan

+0

Но вы можете добавить 'ICompletelyDifferentCriteria' в свой список' ICustomerCriteria', так как унаследовали 'ICriteria'. – Dario

Смежные вопросы