Сбой десятичного преобразования при использовании в подпространстве имен в 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);
}
....
}
}