在 C# 中定义新的运算符? [复制]

Posted

技术标签:

【中文标题】在 C# 中定义新的运算符? [复制]【英文标题】:Define new operators in C#? [duplicate] 【发布时间】:2011-01-19 05:02:45 【问题描述】:

可能重复:Is it possible to create a new operator in c#?

我喜欢 C#,但我希望它能够在类上定义我自己的运算符,例如 A => B,而不必执行 A.Implies(B)。我认为,如果您可以将 [+-*/&^|%$#@>

【问题讨论】:

【参考方案1】:

这不是语言内置的。您被语言附带的预定义运算符重载所困 (overloadable operators)。

如果您喜欢这种调试方式,您可能需要考虑F#。它是一种在 .NET 框架之上运行的函数式语言,让您能够定义所需的任何运算符。

【讨论】:

经过多年的 C++ 项目和项目,我不得不非常不同意您使用“悲伤”这个词。 遗憾地删除了这个词。最近,我在 F# 和 ruby​​ 的内联 DSL 魔法中获得了太多乐趣。【参考方案2】:

可以重载的运算符列表是here。

运算符重载只允许您更改运算符的行为,而不是定义新的运算符。

虽然A => BA.Implies(B) 一样听起来很酷,但它会在以后给您带来问题(6 个月后,当您试图弄清楚您的代码应该做什么时)。

【讨论】:

通过这个论点,我们应该使用a.Plus(b),以防我们忘记+在算术或字符串连接中的含义。如果您可以确定域中符号的含义,然后经常使用它,那么非常很容易记住它的含义。如果你不打算经常使用它,那么发明这个符号是不值得的。所以在实践中,这不是问题。 @Earwicker:我不买。 + 被普遍理解。虽然=> 对您来说可能很有意义,但如果其他人出现并且必须维护您的代码,他们可能会发现意识到或记住正在发生的事情并不容易。 @David Brown:+ 表示 C# 中的字符串连接。它不在 VB.NET 中。因此,它的所有含义并没有被普遍理解。您假设编写代码更好,以便消息灵通的人可以慢慢阅读 - 考虑编写代码可能更好,以便消息灵通的人可以快速阅读。在 C# 3 出来之后,大多数 C# 程序员都不知道 => 在 lambda 中的含义。 C# 团队使用该符号是错误的吗?不,他们希望社区吸收新的含义。同样,发明自己的符号的图书馆服务于一个社区,你可以加入也可以不加入。 @Earwicker 最好编写易于阅读的代码。每次我看到代码中使用的运算符重载时,总是很奇怪,比如businessObj1 % businessObj2~businessObj3。每一行代码都必须参考手册两次是没有好处的,因为到处都有运算符重载。另一方面,我经常在 4 种语言之间切换,具体取决于一天中的什么时间,所以我非常努力地让事情尽可能保持一致。 (而+ 确实表示 VB.Net 中的字符串连接)。 滥用证据不排除存在适当使用。任何适当的白痴都可以滥用任何技术:假设您坚持使用命名方法。白痴可以使用名称Method1Method2 等。同时,请查看 Irony 解析器库,这是在 C# 中创建“内部 DSL”的运算符重载的理想示例,在这种情况下类似于 BNF:irony.codeplex.com/wikipage?title=expression%20grammar%20sample 【参考方案3】:

简而言之,没有。您将不得不查看另一种语言。您可以重载许多 现有 运算符,或定义任何其他 方法(包括非常方便的扩展方法) - 但您不能在任何变体中定义自定义运算符我知道的 C#。

【讨论】:

你可以用现有的操作符做些什么是有限制的——例如如果你定义了==,你必须定义!=等,并且参数/返回类型并不是在所有情况下都是完全开放的。【参考方案4】:

不,这是不可能的,除非您自己制作类似 C# 的编译器。

只能覆盖部分内置运算符,不能新建,不能覆盖 lambda 运算符 (=>)。

【讨论】:

以上是关于在 C# 中定义新的运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 C# 中创建一个新的运算符?

在 C# 中定义 F# '**' 运算符

新的 C# 8.0 开关表达式的运算符优先级是啥?

C# 复习总结类继承和接口

Delphi - 相当于 C# 的三元运算符? [复制]

为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]