C#中能否重载>运算符以支持右侧为Func<>类型操作数?
问题根源:语法歧义导致编译器误解析
你猜的没错!这个编译错误确实是**>紧跟() =>的写法触发了C#编译器的语法歧义**——编译器会优先把>和后续的(尝试解析成右移运算符>>的一部分,完全没认出这是你重载的二元>运算符。
解决方法1:给Lambda表达式套一层括号
通过给整个lambda表达式加上括号,明确告诉编译器>是独立的运算符,后面的是一个完整的lambda参数:
EmployeeQuery q = new EmployeeQuery("q"); q.Select(q.Id > (() => { return new EmployeeQuery("e", out var q1) .Where(q1.Id.IsNotNull()).All(); }));
解决方法2:提前定义Lambda变量
如果觉得套括号不够直观,也可以先把子查询lambda赋值给变量,再传入运算符:
EmployeeQuery q = new EmployeeQuery("q"); Func<esDynamicQuery> subQuery = () => { return new EmployeeQuery("e", out var q1) .Where(q1.Id.IsNotNull()).All(); }; q.Select(q.Id > subQuery);
补充说明
你的esQueryItem重载运算符本身是没问题的,问题出在C#的词法解析逻辑:编译器会优先合并相邻符号形成合法的内置运算符(比如>>),当>后面直接跟(时,它会误以为你要写右移操作,而不是调用自定义的重载运算符。上面两种方法都是通过消除语法歧义,让编译器正确识别你要使用的重载逻辑。
内容的提问来源于stack exchange,提问作者Mike Griffin
相关产品推荐
相关产品推荐

