有人可以解释为什么以下两个例子中的第一个是有效的而另一个不是吗?更具体地说,在第一个例子中,如何在T和TProperty之间建立关系?
//Example 1
class SomeClass<T> where T : class
{
void SomeMethod<TProperty>( Expression<Func<T,TProperty>> expression ){ ... }
}
//Example 2
class SomeClass
{
void SomeMethod<T,TProperty>( Expression<Func<T,TProperty>> expression )
where T : class{ ... }
}
Run Code Online (Sandbox Code Playgroud)
鉴于这两个例子,我希望以下实现可以工作,但第二个不会.
//Implementation w/ Example 1
var sc = new SomeClass<MyDateClass>();
sc.SomeMethod( dt => dt.Year );
//Implementation w/ Example 2
var sc = new SomeClass();
sc.SomeMethod<MyDateClass>( dt => dt.Year );
Run Code Online (Sandbox Code Playgroud)
我无法理解的是第一个示例/实现在执行SomeMethod时如何忽略TProperty泛型类型,但第二个示例/实现不能以及如何在T和TProperty之间建立隐式关系示例/实施1.
解决方案 更改示例2中方法的签名如下:
void SomeMethod<T>( Expression<Func<T,Object>> expression ){ ... }
Run Code Online (Sandbox Code Playgroud)
虽然这将允许在表达式中使用任意对象,因此它确实允许属性清晰度,如实现2中所述.