Подумайте о том, что вы просите от компилятора:
Вы говорите: «Эта функция возвращает IBar или IFoo». Компилятору необходимо знать , потому что они имеют разные интерфейсы. Если вы не выберете конкретный, он не сможет определить, являются ли вызовы, которые вы делаете для возвращаемого значения этой функции, законными.
Скажите, учитывая ваш код, законно ли следующее? (Ответ "кто, черт возьми, знает"):
someClass.FooBarMember.FooMember;
Причина, по которой вы можете объявить тип, который реализует оба варианта, заключается в том, что компилятор знает, что в нем объявлены "FooMember" и "BarMember", поэтому добавьте:
IFooBar : IFoo, IBar{ <...> }
Означает, что любой объявленный вами IFooBar
может правильно разрешать вызовы FooMember и BarMember во время компиляции.
C # является не интерпретируемым языком.