C# 算子的交换性

C# 算子的交换性,c#,programming-languages,C#,Programming Languages,在C#中,语言中没有内置的交换性概念。也就是说,如果我定义一个简单的Vector类,例如: public struct Vector { private readonly double x, y, z; ... public static Vector operator +(Vector v, double d) {...} } 我仍然需要定义对称运算符+(双d,向量v),或者任何形式为2.1*v的表达式都会在动态场景中出现编译错误或在运行时失败 我的问题有两个:首先

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

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

    public static Vector operator +(Vector v, double d) {...}
}
我仍然需要定义对称运算符
+(双d,向量v)
,或者任何形式为
2.1*v
的表达式都会在动态场景中出现编译错误或在运行时失败

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

有没有哪种语言可以定义交换运算符而无需定义两种可能的操作数组合

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

它是否曾在C#中被考虑过,并被废弃,因为它实际上只是为了避免一些额外的击键,而这些击键并不会真正为语言增加那么多丰富的内容(并且很可能需要额外的保留字)

据我所知,它从未被考虑过。当然,它从未出现在可能的语言增强列表中,我也不记得在design notes归档中见过它


你对问题中的特征提出了充分的论点。如果我被要求对所提出的特性提供额外的评论,我会指出,许多重载运算符即使在数学上是可交换的,也不是可交换的。例如,字符串“加法”显然是不可交换的,即使两个操作数都是字符串。代理“加法”也是如此。在自动交换性之前,还有很多其他的算子性质,它们同样或者更有用

用一行定义交换性:
publicstaticvectorator+(doubled,vectorv){returnv+d;}
我相信Haskell立即支持这一点。还有序言。已经快8年了,所以我可能错了。检查这个问题(和答案)谢谢你发布这个。很长一段时间以来,我一直希望在
C
中使用此功能。可能通过属性或关键字(例如隐式用于转换运算符)。