Dirk Sandbrink created THRIFT-4290: -------------------------------------- Summary: C# nullable option generates invalid code for non-required enum field with default value Key: THRIFT-4290 URL: https://issues.apache.org/jira/browse/THRIFT-4290 Project: Thrift Issue Type: Bug Components: C# - Compiler Affects Versions: 0.10.0, 0.9.3 Environment: Windows Reporter: Dirk Sandbrink Priority: Minor
When generating C# code with the nullable option invalid setter code is generated for enum fields which have a default value (and thus still need an isset flag). For example use the Work struct from tutorial.thrift and add a default value to the enum field: {code:thrift} struct Work { 1: i32 num1 = 0, 2: i32 num2, 3: Operation op = Operation.ADD, 4: optional string comment, } {code} The the generated code in Work.cs looks like this: {code:csharp} public Operation? Op { get { return _op; } set { __isset.op = true; this._op = value; } } {code} This code is invalid, because value is of type _Operation?_, the correct code should be: {code:csharp} public Operation? Op { get { return _op; } set { __isset.num1 = value.HasValue; if (value.HasValue) this._num1 = value.Value; } } {code} I believe the error is located in file _t_csharp_generator.cc_ in function _t_csharp_generator::generate_csharp_property_: {code:cpp} if (ttype->is_base_type()) { use_nullable = ((t_base_type*)ttype)->get_base() != t_base_type::TYPE_STRING; } {code} Here use_nullable is set to true for all base types other then string, but not for enums. A quick fix might be to add {code:cpp} else if (ttype->is_enum()) { use_nullable = true; } {code} -- This message was sent by Atlassian JIRA (v6.4.14#64029)