Это можно решить с помощью комбинации явного приведения в конструкторе вместе с поддержкой c # 4.0 для ковариации общих параметров.
Сначала вам нужно вставить приведение в конструктор Foo<T>
:
_bar = new T {Foo = (IFoo<IBar>)this};
Просто делать этого недостаточно. Ваше ограничение, что T : new()
означает, что T
должен быть конкретным классом. Таким образом, IFoo<T>
никогда не будет точно IFoo<IBar>
. Однако если вы укажете, что универсальный параметр T
для IBar<T>
является ковариантным, то приведение от IFoo<Bar>
к IFoo<IBar>
станет допустимым:
public interface IFoo<out T>
Ключевое слово out
указывает, что параметр является ковариантным (что, по сути, означает, что "этот параметр будет выводиться только методами, а не вводом.")
Эта статья MSDN предлагает более подробную информацию о ковариации и контравариантности.