Сбой десятичного преобразования при использовании в подпространстве имен в Microsoft Bond

Ниже приведен пример: https://github.com/Microsoft/bond/tree/master/examples/cs/core/decimal

Я пытаюсь использовать десятичное в структуре, которая не находится в базовом пространстве имен и получить исключение "Выражение типа 'System.Decimal' не может быть использовано для присвоения типу 'System.ArraySegment`1[System.Byte]'".

Если я сохраню все структуры в одном и том же пространстве имен, все будет отлично работать. Есть ли какой-то тип квалификации, которую я должен сделать?

Я собрал небольшой проект и несколько модульных тестов для демонстрации: https://github.com/oculuss/BondDecimalExample

TestA имеет все в одном пространстве имен. TestB имеет несколько подпространств имен (и это то, что ломается).

1 ответ

Решение

BondTypeAliasConverter должен быть определен "в той же сборке и пространстве имен, что и класс, представляющий схему (схемы) Bond, в которой используется псевдоним типа, или сборку / пространство имен одного из преобразуемых типов". Его нельзя определить в родительском пространстве имен. Алгоритм поиска не такой умный.:-) Таким образом, в TestB вам нужно поместить класс BondTypeAliasConverter в пространство имен C# "BondExampleB.Global.SecondType.SecondTypeA" (или везде, где вы отобразили это в C#).

Есть открытое проектное предложение, чтобы сделать это немного легче. Смотрите выпуск № 594 в проекте Bond GitHub.

Пока что-то из этого не получится, если вы хотите иметь одинаковые конвертеры для типов в разных пространствах имен, вам нужно будет сделать что-то вроде этого:

namespace Util
{
    public static class BondTypeAliasConverter
    {
        public decimal Convert(ArraySegment<byte> blob, decimal unused) { ... }
        public ArraySegment<byte> Convert(decimal d, ArraySegment<byte> unused) { ... }
    }
}

namespace First
{
    public static class BondTypeAliasConverter
    {
        public decimal Convert(ArraySegment<byte> blob, decimal unused)
        {
            return Util.BondTypeAliasConverter.Convert(blob, unused);
        }

        ....
    }
}

namespace First.Second
{
    public static class BondTypeAliasConverter
    {
        public decimal Convert(ArraySegment<byte> blob, decimal unused)
        {
            return Util.BondTypeAliasConverter.Convert(blob, unused);
        }

        ....
    }
}
Другие вопросы по тегам