La source suivante fonctionne comme prévu lorsque vous utilisez .NET dans Visual Studio, mais il jette l'exception mentionnée ci-dessus lors de l'utilisation du cadre Mono:ArgumentException: type de retour de la méthode est incompatible (Mono)
class Foo<TEnum> where TEnum : struct {
private static Func<int, int> Identity = (value) => value;
private static Func<int, TEnum> IntToEnum = Delegate.CreateDelegate(typeof(Func<int, TEnum>), Identity.Method) as Func<int, TEnum>;
private static Func<TEnum, int> EnumToInt = Delegate.CreateDelegate(typeof(Func<TEnum, int>), Identity.Method) as Func<TEnum, int>;
public static bool EnumEquals(TEnum lhs, TEnum rhs) {
return EnumToInt(lhs) == EnumToInt(rhs);
}
}
Foo<SomeEnum>.EnumEquals(SomeEnum.A, SomeEnum.B);
Y at-il une solution de contournement à ce qui, comme ci-dessus, évite les valeurs de boxe/unboxing?
Je suis coincé avec la mise en œuvre Mono qui se trouve à l'intérieur de l'unité:/
L'exception
ArgumentException: method return type is incompatible
System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System/Delegate.cs:190)
System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System/Delegate.cs:291)
System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System/Delegate.cs:295)
Foo`1[SomeEnum]..cctor()
...
Je ne suis pas certain de la fiabilité de cette proposition, mais elle semble fonctionner (http://hastebin.com/ahoxoleyed.cs). –