Closed jdharmawan closed 10 months ago
Thanks for reaching out. The behavior that you're observing is currently an intentional design choice in FlatSharp. The root of the reason for this choice is the way that FlatSharp defines Unions:
public struct Weapons : IFlatBufferUnion<Sword, Sword, Halberd>
{
// Constructor for 'Claymore'
public Weapons(Sword sword) { }
// Constructor for 'Rapier'.
public Weapons(Sword sword) { }
public Weapons(Halberd halberd) { }
}
Unfortunately, this means that the C# compiler can't distinguish between the constructors for Claymore
and Rapier
. So, Flatsharp emits this error before the C# compiler can emit a more confusing error.
Now, there are some other approaches that might work, but they would be breaking changes. For example:
public struct Weapons : IFlatBufferUnion<Sword, Sword, Halberd>
{
public static Weapons NewRapier(Sword s) { }
public static Weapons NewClaymore(Sword s) { }
public static Weapons NewHalberd(Halberd h) { }
}
I think this is worth revisiting the next time I do a major revision to FlatSharp, but I take breaking changes really seriously, so I want to be thoughtful about it.
In the meantime, Wouldn't it be logical for your Sword struct to have a type?
enum SwordKind : ubyte {
Rapier = 0,
Claymore = 1,
}
struct Sword {
damage: int32;
material: Material;
kind : SwordKind;
}
Thank you for the support and clarifications.
I'll think of an alternative solution in the meantime.
Flatsharp union don't support using the same type multiple times in a Union. This is incompatible with Google.Flatbuffers syntax. I feel that this issue needs to be addressed.
Schema used for testing:
Error when trying to compile