Почему я получаю: тип 'IThirdParty' определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «ThirdPartyAssembly»? - PullRequest
1 голос
/ 24 июня 2019

Предположим, существует сторонняя сборка ThirdPartyAssembly.dll, которая предоставляет следующее:

namespace ThirdPartyAssembly
{
    public interface IThirdParty
    {
        void GetInstance(ThirdPartyInfo info);
    }

    public class ThirdPartyInfo
    {
        public ThirdPartyInfo(string instanceText);
        public string InstanceText { get; set; }
    }
}

В одном из проектов решения MyAssembly я ссылаюсь ThirdPartyAssembly.dll и реализую следующий код:

namespace MyAssembly
{
    public abstract class AbstractMyClass1 : IThirdParty
    {
        void IThirdParty.GetInstance(ThirdPartyInfo info)
        {
            info.InstanceText = "some-text";
        }
    }

    public abstract class AbstractMyClass1Consumer<T>
        where T : AbstractMyClass1
    {
    }
}

Во втором проекте решения MyAssemblyConsumer Я ссылаюсь MyAssembly (в качестве ссылки на проект решения) и реализую следующее классифицированное

namespace MyAssemblyConsumer
{
    class MyClass1 : AbstractMyClass1
    {
    }

    class MyClass1Consumer : AbstractMyClass1Consumer<MyClass1>
    {
    }
}

Пока все компилируется нормально.Однако, когда я добавляю IMyClass2 в MyAssembly проект, который наследует IThirdParty интерфейс со следующими абстрактными классами

namespace MyAssembly
{
    public interface IMyClass2 : IThirdParty
    {
    }

    public abstract class AbstractMyClass2 : IMyClass2
    {
        void IThirdParty.GetInstance(ThirdPartyInfo info)
        {
            info.InstanceText = "some-text";
        }
    }

    public abstract class AbstractMyClass2Consumer<T>
        where T : IMyClass2
    {
    }
}

, и пытаюсь реализовать следующие классы в MyAssemblyConsumer

namespace MyAssemblyConsumer
{
    class MyClass2 : AbstractMyClass2
    {
    }
    class MyClass2Consumer : AbstractMyClass2Consumer<MyClass2>
    {
    }
}

Я получаю следующую ошибку компиляции на MyClass2Consumer:

Тип 'IThirdParty' определен в сборке, на которую нет ссылок.Вы должны добавить ссылку на сборку "ThirdPartyAssembly"

Вопрос, почему мне не нужно ссылаться на ThirdParty.dll в первом случае, но нужна ли эта ссылка во втором случае?

1 Ответ

1 голос
/ 24 июня 2019

Это происходит потому, что в первом случае вы «скрываете» свою ссылку на ThirdPartyAssembly.dll.Да, ваш публичный AbstractMyClass1 реализует IThirdParty из него, но он реализует его неявно , поэтому единственный способ вызвать IThirdParty.GetInstance() метод выглядит следующим образом:

var myClass1Instance = new MyClass1();
var info = new ThirdPartyInfo(); 

(myClass1Instance as IThirdParty).GetInstance(info); // this can be called
myClass1Instance.GetInstance(info); // <- this method doesn't exists

Так что ввремя компиляции вашего MyAssemblyConsumer компилятора проекта не должно ничего знать о IThirdParty.Поскольку вы сказали, что ваш первый случай успешно компилируется, я полагаю, у вас нет такого кода.

Во втором случае вы выставляете IThirdParty из ThirdPartyAssembly.dll с помощью вашего открытого IMyClass2 интерфейса.В этом случае компилятор должен знать об интерфейсе IThirdParty во время компиляции (в той строке, где вы определяете AbstractMyClass2Consumer<T>), поэтому вы получаете это исключение.

...