Это плохой дизайн для реализации обоих. Имейте два разных дочерних объекта, которые вы подписываете на двух наблюдателей. Я рекомендую иметь два дочерних объекта, каждый из которых реализует один из интерфейсов.
class Beholder
{
public IObserver<Foo> FooObserver{get;private set;}
public IObserver<Bar> BarObserver{get;private set;}
}
Когда противоречивость неоднозначна?
Тем не менее, я не вижу здесь непосредственной проблемы, поэтому предупреждение VB.net выглядит действительно странным для меня.
IObserver<in T>
является противоположным вариантом. Таким образом, чтобы вызвать двусмысленность, вам нужно найти T
, такие как IObserver<Foo>
и IObserver<Bar>
равны IObserver<T>
.
Если оба Foo
и Bar
являются независимыми классами, таких T
не существует, поскольку их нужно извлекать из обоих, чего не позволяет система типов .net.
Если бы любой из них был интерфейсом, возникла бы двусмысленность: просто создайте класс, производный от Foo
и реализующий IBar
.
Если бы один был получен от другого, это также было бы неоднозначно: если Foo
получено из Bar
, то IObserver<Bar>
также IObserver<Foo>
.
Когда со-дисперсия неоднозначна?
И, наконец, с ко-вариантными интерфейсами, такими как IEnumerable<T>
, достаточно иметь общий базовый класс, в который оба преобразуются в ссылки. И Object
выполняет это для любых двух классов (но не для типов значений).
Но IEnumerable<T>
будет работать без ковариации, так как вам нужна последовательная реализация не универсального IEnumerable
, а это невозможно для двух независимых классов.