Определить во внешнем проекте - PullRequest
0 голосов
/ 03 февраля 2020

У меня 2 проекта. Вложенный проект имеет 2 модели: Model1in и Model1Out.

namespace Test.Nested
{
    public class Model1in
    {
#if NATIVE
        public static explicit operator Model1in(Model1Out model)
        {
            return model == null ? null : new Model1in();
        }
#endif
    }

    public class Model1Out
    {
#if NATIVE
        public static explicit operator Model1Out(Model1in model)
        {
            return model == null ? null : new Model1Out();
        }
#endif     
}

Но в другом проекте я хочу преобразовать объект Model1in в Model1Out и обратно.

#define NATIVE

namespace Test.Native
{
     ....
     Model1Out model = (Model1Out)Model1in;
}

Компилятор генерирует ошибка и не распознает блок преобразования модели. Просит реализовать. Оказывается, он просто не видит блок #define NATIVE. Что не так? Я добавляю ссылку на проект Nested, Native, использую его и определяю константу в настройках проекта.

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>DEBUG;NATIVE</DefineConstants>
</PropertyGroup>

Если я использую этот инструмент для константы в проекте Nested - никаких проблем, но у меня есть другие проект, где этот блок не может быть использован, и я хочу скрыть implicit|explicit строительство.

1 Ответ

3 голосов
/ 11 февраля 2020

Я не совсем понимаю ваш вопрос. Выполняете ли вы эти шаги?

  1. Компиляция Test.Nested без определения NATIVE, создание Test.Nested.dll
  2. Теперь в Test.Native, добавление ссылка на Test.Nested.dll
  3. Попробуйте скомпилировать Test.Native с NATIVE, определенным для создания Test.Native.dll
  4. Получите ошибку компилятора, что operator Model1Out() не определено

Если это ваша проблема, то вот что происходит.

Директива #if используется только при первой компиляции проекта. Если вы компилируете Test.Nested.dll без определения NATIVE, то код между #if NATIVE и #endif вообще не будет включен в Test.Nested.dll. Это как если бы вы скомпилировали этот код:

namespace Test.Nested
{
    public class Model1in
    {
    }

    public class Model1Out
    {
    } // I added a missing end brace here
}

Ваши классы пусты, и Test.Nested.dll не имеет определенных преобразований.

Если Test.Nested пусто, потому что оно не скомпилировано с определением NATIVE, то при компиляции Test.Native вы получите ошибку независимо от того, определен ли NATIVE, поскольку блок преобразования никогда не включался в Test.Nested.dll.

Для использования блоки преобразования, вы должны определить NATIVE при компиляции Test.Nested.

...