假设您在集合上运行AsQueryable(),转换为IQueryable<> 它获得了两组扩展方法,因为它实现了IEnumerable<>
由于您可以为Expression和Func<>分配单行lambda, 和许多扩展方法具有相同的名称,编译器规则是什么 解决冲突?似乎编译器假定表达式 并且每当你想使用Func<>你必须明确地将参数强制转换为Func<> 你必须考虑两种情况:单行lambda和多行lambda 表达式甚至不适用意味着编译器应该假设Func<> 自动。但是,编译器始终假定为Expression。规则记录在哪里?
List<int> grades_l = new List<int> { 78, 92, 100, 37, 81};
static public bool TWrite(int value)
{
Console.WriteLine("Value={0}",value);
return true;
}
// these are single-line lambdas
// Compiler assumes Expression<Func<>> and if you want Func<> then you have to cast
var all2_i3 = grades_l.All(i => TWrite(i)); // Func<>
var all2_q = grades_l.AsQueryable().All(i => TWrite(i)); // Expression<Func<>>
var all2_q2 = grades_l.AsQueryable().All((Func<int, bool>)(i => TWrite(i))); // Func<>
// these are multiple-line lambdas
// Compiler assumes Expression<Func<>> even though multiple-line lambda implies Func<>
var all2_i = grades_l.All(i => { TWrite(i); return true; }); // Func<>
var all2_i2_nc = grades_l.AsQueryable().All(i => { TWrite(i); return true; }); // fails to compile
var all2_i2 = grades_l.AsQueryable().All((Func<int, bool>)(i => { TWrite(i); return true; })); // Func<>