C# Unity can't cast integer represented enum value.
```
namespace MyGame;
enum CommandType : byte {
None = 0,
}
table Command {
id:int;
type:CommandType;
}
```
then generate c# files. it'll output compile error like these.
```
Assets/MyGame/Command.cs(18,39): error CS1041: Identifier expected
Assets/MyGame/Command.cs(18,39): error CS1737: Optional parameter cannot precede required parameters
16: public static Offset<Command> CreateCommand(FlatBufferBuilder builder,
17: int id = 0,
18: CommandType type = (CommandType)0) {
```
diff --git a/src/idl_gen_general.cpp b/src/idl_gen_general.cpp
index fdb6df7..99bd9ca 100644
--- a/src/idl_gen_general.cpp
+++ b/src/idl_gen_general.cpp
@@ -409,6 +409,24 @@
: value.constant;
}
+static std::string GenEnumDefaultValue(const FieldDef &field) {
+ auto enum_def = field.value.type.enum_def;
+ auto vec = enum_def->vals.vec;
+ auto default_value = StringToInt(field.value.constant.c_str());
+
+ auto result = field.value.constant;
+ for (auto it = vec.begin(); it != vec.end(); ++it) {
+ auto enum_val = **it;
+ if (enum_val.value == default_value) {
+ result = enum_def->name + "." + enum_val.name;
+ break;
+ }
+ }
+
+ return result;
+}
+
+
static void GenEnum(const LanguageParameters &lang, EnumDef &enum_def,
std::string *code_ptr) {
std::string &code = *code_ptr;
@@ -873,14 +891,15 @@
// supply all arguments, and thus won't compile when fields are added.
if (lang.language != GeneratorOptions::kJava) {
code += " = ";
- // in C#, enum values have their own type, so we need to cast the
- // numeric value to the proper type
+ // in C#, enum values have their own type, but Unity (specifically .Net 3.5) can't
+ // cast enum type from numeric value.
if (lang.language == GeneratorOptions::kCSharp &&
field.value.type.enum_def != nullptr &&
field.value.type.base_type != BASE_TYPE_UNION) {
- code += "(" + field.value.type.enum_def->name + ")";
+ code += GenEnumDefaultValue(field);
+ } else {
+ code += GenDefaultValue(lang, field.value, false);
}
- code += GenDefaultValue(lang, field.value, false);
}
}
code += ") {\n builder.";
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.cs b/tests/MyGame/Example/TestSimpleTableWithEnum.cs
index 9b436ff..245d330 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.cs
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.cs
@@ -14,7 +14,7 @@
public bool MutateColor(Color color) { int o = __offset(4); if (o != 0) { bb.PutSbyte(o + bb_pos, (sbyte)color); return true; } else { return false; } }
public static Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(FlatBufferBuilder builder,
- Color color = (Color)2) {
+ Color color = Color.Green) {
builder.StartObject(1);
TestSimpleTableWithEnum.AddColor(builder, color);
return TestSimpleTableWithEnum.EndTestSimpleTableWithEnum(builder);