Mat*_*ero 3 .net c# generics type-inference
请考虑以下示例:
public class Person
{
public int Age { get; set; }
}
public class Builder<TSource>
{
public Builder<TSource> WithValue<TValue>(Func<TSource, TValue>, TValue value)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这两行可以正常工作和运行:
Builder<Person> builder = new Builder<Person>();
builder.WithValue(p => p.Age, 20);
Run Code Online (Sandbox Code Playgroud)
但这些也是如此:
Builder<Person> builder = new Builder<Person>();
object age = "20"; // <-- string value
builder.WithValue(p => p.Age, age);
Run Code Online (Sandbox Code Playgroud)
类型推断不是按照我希望它在后一个例子中工作的方式工作.
如果我指定一个表达式p => p.Age,Func<Person, int>我希望第二个参数被约束为一个int类型.然而,我能够通过object罚款.
我猜这是因为类型推断是从右到左完成的.也就是说,TValue论证被认为是一个object,然后我的Func<TSource, TValue>表达被约束为a Func<Person, object>,它p => p.Age满足就好了.
我的假设是否正确?
如果是这样,为什么类型推断以这种方式完成?我觉得从左到右更自然.
它根本不依赖于订单.参数p => p.Age是添加约束,无论什么TValue必须是可以存储的类型int.这可以是int它继承的任何类型,例如,object.当你传入时,age你说它TValue必须是一种可以存储的类型object.然后,它将选择满足所有这些约束的最派生类型,在本例中为object.如果更改参数的顺序,也会发生同样的事情.
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |