diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index 6adc2626..305bfd1e 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -556,11 +556,12 @@ namespace CppSharp.Generators.CSharp realPointer = templateSubstitution.Replacement.Type.Desugar() as PointerType; realPointer = realPointer ?? pointer; var pointee = pointer.Pointee.Desugar(); - if (Context.Function != null && realPointer.IsPrimitiveTypeConvertibleToRef() && - Context.MarshalKind != MarshalKind.VTableReturnValue && - Context.Function.OperatorKind != CXXOperatorKind.Subscript) + if (Context.Function != null && + (realPointer.IsPrimitiveTypeConvertibleToRef() || + (templateSubstitution != null && realPointer.Pointee.IsEnumType())) && + Context.MarshalKind != MarshalKind.VTableReturnValue) { - var refParamPtr = string.Format("__refParamPtr{0}", Context.ParameterIndex); + var refParamPtr = $"__refParamPtr{Context.ParameterIndex}"; if (templateSubstitution != null) { var castParam = $"__{Context.Parameter.Name}{Context.ParameterIndex}"; @@ -573,8 +574,9 @@ namespace CppSharp.Generators.CSharp Context.Before.Write("&"); Context.Before.WriteLine($"{castParam};"); Context.Return.Write(refParamPtr); + return true; } - else + if (Context.Function.OperatorKind != CXXOperatorKind.Subscript) { if (Context.Parameter.Kind == ParameterKind.PropertyValue) { @@ -588,8 +590,8 @@ namespace CppSharp.Generators.CSharp Context.Before.WriteStartBraceIndent(); Context.Return.Write(refParamPtr); } + return true; } - return true; } var param = Context.Parameter; diff --git a/tests/CSharp/CSharpTemplates.h b/tests/CSharp/CSharpTemplates.h index 191e741d..c3b2dcc8 100644 --- a/tests/CSharp/CSharpTemplates.h +++ b/tests/CSharp/CSharpTemplates.h @@ -346,6 +346,7 @@ class TemplateWithIndexer public: TemplateWithIndexer(); T& operator[](int i); + T& operator[](const T& key); T& operator[](const char* string); private: T t[1];