Tencent / xLua

xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc.
Other
9.43k stars 2.46k forks source link

C#函数,使用in/ref/out修饰的参数,如果再支持默认值,则xlua会报错 #1105

Open ajycode opened 11 months ago

ajycode commented 11 months ago

见OverloadMethodWrap类的Init方法 var defalutValue = paramInfos[i].DefaultValue; if (paramInfos[i].IsOptional) { if (defalutValue != null && defalutValue.GetType() != paramInfos[i].ParameterType) { defalutValue = defalutValue.GetType() == typeof(Missing) ? (paramInfos[i].ParameterType.IsValueType() ? Activator.CreateInstance(paramInfos[i].ParameterType) : Missing.Value) : Convert.ChangeType(defalutValue, paramInfos[i].ParameterType); } HasDefalutValue = true; }

如果函数参数支持默认值,则会进入到这段代码,会根据参数类型对默认值做强制转换 但是如果函数参数是被in/out/ref修饰的,假设参数类型是T,则函数参数的实际类型是T&,而默认值参数类型是T,这里做强制转换被失败抛出异常,导致类的后续函数不会被收集。

这里应该再需要加上一条判断语句 defalutValue.GetType().MakeByRefType() != paramInfos[i].ParameterType