You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:26