1

按照此处的示例: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 有一些子命名空间(这就是中断)。

4

1 回答 1

1

BondTypeAliasConverter必须定义在“表示使用类型别名的 Bond 模式的类或正在转换的类型之一的程序集/命名空间相同的程序集和命名空间中”。它不能在父命名空间中定义。搜索算法不是那么聪明。:-) 因此,在 TestB 中,您需要将 BondTypeAliasConverter 类放在 C# 命名空间“BondExampleB.Global.SecondType.SecondTypeA”(或您在 C# 中映射到的任何位置)中。

有一个开放的设计建议可以使这更容易一些。请参阅Bond GitHub 项目中的问题 #594

在此之前,如果您想为不同命名空间中的类型使用相同的转换器,则需要执行以下操作:

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);
        }

        ....
    }
}
于 2017-11-17T21:38:21.827 回答