【发布时间】:2016-10-31 13:47:59
【问题描述】:
考虑以下示例:
public class Person
{
public int Age { get; set; }
}
public class Builder<TSource>
{
public Builder<TSource> WithValue<TValue>(Func<TSource, TValue>, TValue value)
{
// ...
}
}
这两行运行良好:
Builder<Person> builder = new Builder<Person>();
builder.WithValue(p => p.Age, 20);
但这些也是如此:
Builder<Person> builder = new Builder<Person>();
object age = "20"; // <-- string value
builder.WithValue(p => p.Age, age);
类型推断并没有像我期望的那样在后一个示例中起作用。
如果我指定表达式p => p.Age,即Func<Person, int>,我希望第二个参数被限制为int 类型。然而,我可以通过object 就好了。
我猜这是因为类型推断是从右到左进行的。也就是说,TValue 参数被推断为object,然后我的Func<TSource, TValue> 表达式被限制为Func<Person, object>,p => p.Age 满足就好了。
我的假设正确吗?
如果是这样,为什么要以这种方式进行类型推断?我觉得从左到右更自然。
【问题讨论】:
标签: c# .net generics type-inference