Посылка моего вопроса на простом английском:
- Библиотека под названием
Foo
зависит от библиотеки с именемBar
- Класс внутри Foo расширяет класс внутри Bar
- Foo определяет свойства/методы, которые просто передаются в Bar
- Приложение
FooBar
зависит только от Foo
Рассмотрим следующий пример:
class Program
{
static void Main(string[] args)
{
Foo foo = Foo.Instance;
int id = foo.Id; // Compiler is happy
foo.DoWorkOnBar(); // Compiler is not happy
}
}
Foo определяется следующим образом
public class Foo : Bar
{
public new static Foo Instance { get => (Foo)Bar.Instance; }
public new int Id { get => Bar.Id; }
public void DoWorkOnBar()
{
Instance.DoWork();
}
}
Бар определяется следующим образом
public class Bar
{
public static Bar Instance { get => new Bar(); }
public static int Id { get => 5; }
public void DoWork() { }
}
Часть, которая полностью превзошла меня:
Без ссылки на библиотеку Bar
-
FooBar
может получить идентификатор, предоставленныйBar
(или, по крайней мере, он компилирует) -
FooBar
не может просить Foo выполнять работу, которая в конечном итоге выполняетсяBar
Ошибка компилятора, связанная с foo.DoWorkOnBar();
является
Тип "Бар" определяется в сборке, на которую не ссылаются. Вы должны добавить ссылку на сборку 'Bar, Version 1.0.0.0, Culture = Neutral, PublicKeyToken = null'.
Почему в компиляторе существует несоответствие?
Я бы предположил, что ни одна из этих операций не будет компилироваться без добавления FooBar
ссылки на Bar
.