如何更改泛型方法中从哪个参数推断出的类型?

How to change from which argument is the type inferred in generic methods?

假设我的 Utils class 中有一个静态方法,它设置 属性.

的值
public static SetPropertyValue<TDest, TVal>
    (Expression<Func<TDest, TVal>> expression, 
     TDest destination, 
     TVal value) 
{ 
    // ...
}

另外还有一个class:

public class DataObject { public short Code { get; set; } }

以及使用代码:

DataObject obj = new DataObject();
int code = 404;
Utils.SetPropertyValue(m => m.Code, obj, code);

当上述代码为运行时,表达式变为m => Convert(m.Code),因为给定的第三个参数是一个整数并且表达式需要。这意味着类型推断系统决定更喜欢第三个参数来确定 TVal 类型。

我希望此方法的第三个参数(值) 限制为第一个参数(表达式) 定义的类型。这可能吗?如果是,如何?

不,你不能那样影响类型推断 - 如果它 did 推断 TValshort,你的代码将无法编译,因为没有从 intshort.

的隐式转换

当然,最好的解决方案就是避免使用两种不同的类型开始:

short code = 404;
Utils.SetPropertyValue(m => m.Code, obj, code);

现在可以正确推断类型,不会有任何转换。