C# AsQueryable()之后如何解析扩展方法?

C# AsQueryable()之后如何解析扩展方法?,c#,C#,假设在一个变为IQueryable的集合上运行AsQueryable() 它获取两组扩展方法,因为它实现了IEnumerable 由于可以将单行lambda指定给表达式和Func, 许多扩展方法都有相同的名称,编译器规则是什么 解决冲突?编译器似乎采用了表达式 无论何时使用Func,都必须将参数显式转换为Func 必须考虑两种情况:单行lambda和多行lambda 表达式甚至不适用,这意味着编译器应该采用Func 自动地但是,编译器始终采用表达式。规则记录在哪里 List<int>

假设在一个变为IQueryable的集合上运行AsQueryable() 它获取两组扩展方法,因为它实现了IEnumerable

由于可以将单行lambda指定给表达式和Func, 许多扩展方法都有相同的名称,编译器规则是什么 解决冲突?编译器似乎采用了表达式 无论何时使用Func,都必须将参数显式转换为Func 必须考虑两种情况:单行lambda和多行lambda 表达式甚至不适用,这意味着编译器应该采用Func 自动地但是,编译器始终采用表达式。规则记录在哪里

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<>
List grades\u l=新列表{78,92,100,37,81};
静态公共bool TWrite(int值)
{
WriteLine(“Value={0}”,Value);
返回true;
}
//这些是单线lambda
//编译器采用表达式,如果需要Func,则必须强制转换
var all2_i3=等级所有(i=>t写入(i));//Func
var all2_q=grades_l.AsQueryable().All(i=>TWrite(i));//表情
var all2_q2=grades_l.AsQueryable().All((Func)(i=>TWrite(i));//Func
//这些是多行lambda
//即使多行lambda表示Func,编译器也假定表达式
var all2_i=grades_l.All(i=>{TWrite(i);返回true;});//Func
var all2_i2_nc=grades_l.AsQueryable().All(i=>{TWrite(i);返回true;});//未能编译
var all2_i2=grades_l.AsQueryable().All((Func)(i=>{TWrite(i);返回true;}));//Func