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

时间:2015-02-26 09:13:57

标签: c# generics lambda type-inference linq-expressions

假设我的Utils类中有一个静态方法,它设置属性的值。

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

此外,还有一个课程:

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),因为给出的第三个参数是整数,表达式需要 short 。这意味着类型推断系统决定更喜欢第三个参数来确定TVal类型。

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

1 个答案:

答案 0 :(得分:2)

不,你不能以这种方式影响类型推断 - 如果它 推断TValshort,你的代码将无法编译,因为没有隐含从int转换为short

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

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

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