Passing signed and unsigned int to autoclosure

(Fredy Ferrari) #1

I have a problem in passing signed and unsigned integers as parameter to an autoclosure method. I need to be able to pass both kind, signed and unsigned properties. But was unable to come up with a solution which accepts unsigned integers at all.

  1. function MyFunc([autoclosure] code: Expression<Func<Integer>>):Boolean;
    accepts properties of type integer.

  2. function MyFunc([autoclosure] code: Expression<Func<UInt32>>):Boolean; still
    accepts properties of type integer, but not UInt32.

  3. function MyFunc<T>([autoclosure] code: Expression<Func<T>>):Boolean where T is record;
    can solve the problem but has other problems:
    a. Due to the fact of missing underlying support for integer constraints in .NET, there is no way to limit the type to an Int and any struct will be accepted.
    b. It requires the caller to qualify the generic type. What is a nogo in my situation, as it requires changes in the untouchable business logic. Ex.:
    var result := MyFunc<UInt32>(t.Errorcode); // where Errorcode is of type UInt32

Furthermore, even when version 2 would accept unsigned integers, I could not have the two methods 1 & 2 be defined at the same time, as I get an (E110) Ambiguous call to overloaded method “MyFunc” error.

Probably off topic but nevertheless another interesting point is that the non-generic versions 1 & 2 give me a UnaryExpression containing the original property as Operand, where the generic version 3 gives me a MemberExpression.
I understand that the UnaryExpression is an encapsulation due to the value/non-ref property. But then I don’t yet understand why the generic version can pass a MemberExpression, even when the the constraint is explicitly struct (resp. record).

Any ideas?

(Fredy Ferrari) #2

Ah, sorry, it’s not my day :slight_smile:
I found the problem. I forgot that when you have an autoclosure, it is attractive to more or less everything passed as parameter and it ends up in conflicts when overloaded methods exist.
I can now pass signed and unsigned ints and only need one single method which accepts all but I have to rename/remove the other/older overloaded methods.