8

在 C# 中,语言中没有内置的交换性概念。也就是说,如果我定义一个简单的Vector类,例如:

public struct Vector
{
    private readonly double x, y, z;
    ...

    public static Vector operator +(Vector v, double d) {...}
}

我仍然需要定义对称运算符+(double d, Vector v),否则表单的任何表达式2.1 * v都会在动态场景中产生编译错误或在运行时失败。

我的问题是双重的:首先,是否有任何语言可以定义交换运算符而无需定义两种可能的操作数组合?换句话说,是否有任何语言意识到交换性的概念本身?其次,它是否曾经在 C# 中考虑过并被废弃,因为它实际上只是语法糖,以避免一些额外的击键,这些击键并没有真正增加语言的丰富性(并且很可能需要一个额外的保留字)?

4

1 回答 1

7

是否有任何语言可以定义交换运算符而无需定义两种可能的操作数组合?

我不知道,但这并不意味着它们不存在。

是否曾经在 C# 中考虑过并废弃它,因为它实际上只是语法糖,以避免一些额外的击键,而这些击键并没有真正增加语言的丰富性(并且很可能需要一个额外的保留字)?

据我所知,它从未被考虑过。它肯定从未出现在可能的语言增强列表中,而且我不记得在设计说明档案中看到过它。

您对问题中的功能提出了充分的论据。如果我被要求对提议的特性提供额外的批评,我会指出许多重载运算符不是可交换的,即使它们的数学对应物是可交换的。例如,字符串“加法”显然不是可交换的,即使两个操作数都是字符串。代表“加法”也是如此。还有许多其他的运算符属性同样有用,或者更有用,我想在自动交换之前加入这些属性。

于 2013-06-04T15:35:18.733 回答