fun*_*oul 6 c# generics extension-methods
我想要一个适用于我的List和IQueryable的扩展方法.下面的扩展方法实现了这一点,但是如果我添加另一个相同的扩展方法,但是在不同的完全不相关的类型上,我会得到不明确的调用编译错误.这是为什么?编译器是否足够聪明,无法知道哪种扩展方法有效?我的意思是,这些调用中只有一个是有效的,为什么编译器不能告诉?非常感谢!
class ClassA
{
public bool IsActive{ get; set;}
}
class ClassB
{
public bool IsActive { get; set;}
}
// then here are my extensions
public static T IsActive<T>(this T enumerableOrQueryable, bool isActive)
where T : IEnumerable<ClassA>
{
return (T)enumerableOrQueryable.Where(x => x.IsActive == isActive);
}
public static T IsActive<T>(this T enumerableOrQueryable, bool isActive)
where T : IEnumerable<ClassB>
{
return (T)enumerableOrQueryable.Where(x => x.IsActive == isActive);
}
Run Code Online (Sandbox Code Playgroud)
重载规则没有考虑它正在考虑的方法的约束 - 它确定哪个重载是最好的,然后验证约束匹配.
编译器完全遵循C#规范的规则.
相关博文:
编辑:请注意,使用"enumerableOrQueryable" 总是将lambda表达式转换为委托,而不是表达式树.因此,如果您希望它以不同的方式为数据库执行逻辑,那么无论如何都需要进行更改.
编辑:你的点子也不会工作,因为你不会得到相同的结果打出来呢-如果你调用Where一个List<string>,返回值是不是一个List<string>.
如果您可以引入由ClassA和ClassB实现的新接口,那么您可以做到这一点:
public static IQueryable<T> IsActive<T>(this IQueryable<T> source, bool isActive)
where T : ICanBeActive
{
// Lambda converted to an expression tree
return source.Where(x => x.IsActive == isActive);
}
public static IEnumerable<T> IsActive<T>(this IEnumerable<T> source,
bool isActive) where T : ICanBeActive
{
// Lambda converted to a delegate
return source.Where(x => x.IsActive == isActive);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2698 次 |
| 最近记录: |