当 CLSCompliant(true) 时,运算符不应该重载 C#?

When CLSCompliant(true) , Operators should not be overloaded C#?

当 CLSCompliant(true) 时,基本规则之一:"Operators should not be overloaded"。 请让我知道,以上说法是真还是假。说明原因。

CLS代表Common Language Specification。问题是 CLSIL 特性的一个子集,所有 .NET 语言都支持它。简而言之,并非每种 .NET 语言都支持运算符重载。这就是编译器认为它不是 CLS compliant.

的原因

更新
例如VB.NET不支持运算符重载。

考虑以下示例:

public struct DateTime 
{
   public static TimeSpan operator -(DateTime t1, DateTime t2) { }
   public static TimeSpan Subtract(DateTime t1, DateTime t2) { }
}

在 C# 中,您可以执行以下操作:

DateTime dt1 = new DateTime();
DateTime dt2 = new DateTime();
DateTime dt3 = dt2 - dt1;

在 VB.NET 中,您不能这样做。在 VB.NET 您将使用

DateTime dt1 = new DateTime();
DateTime dt2 = new DateTime();
DateTime dt3 = dt2.Subtract(dt1);

接受的答案很旧,但我很确定它不正确。运算符重载符合 CLS。在 .NET 程序集的 public 接口中放置运算符重载是合法的,只是很难从不支持简单语法的 VB.NET 使用它。

考虑以下 C# 代码。它被标记为符合 CLS。在构建时,编译器警告说,大小写不同的两个 public 字段 (MyTestField/myTestField) 不符合 CLS。但是,它不会就运算符重载发出警告,它认为这是正常的。

using System;
[assembly: CLSCompliant(true)]

namespace ClassLibrary1
{
    public class Class1
    {
        public int MyTestField;
        public int myTestField;
        public static int operator +(Class1 lhs, Class1 rhs) => lhs.MyTestField + rhs.MyTestField;
    }
}

原因是重载 可以 在没有运算符重载的语言中使用,例如 VB.NET。 C# 编译器在 IL 中创建了一个 op_Addition 方法,这可以直接从 VB.NET.

调用

如果我取出第二个 myTestField,然后从 VB.NET 应用程序构建并引用我的 class 库,则以下代码可以正常工作。它从 VB.NET:

调用 + 运算符

C#

using System;
[assembly: CLSCompliant(true)]

namespace ClassLibrary1
{
    public class Class1
    {
        public int MyTestField;
        public static int operator +(Class1 lhs, Class1 rhs) => lhs.MyTestField + rhs.MyTestField;
    }
}

VB.NET

Imports ClassLibrary1

Module Program
    Sub Main()
        Dim c As Class1 = New Class1 With {.MyTestField = 1}
        Console.Write(Class1.op_Addition(c, c))
    End Sub
End Module

Microsoft design guidelines 讨论这个:'Many languages do not support operator overloading. For this reason, it is recommended that types that overload operators include a secondary method with an appropriate domain-specific name that provides equivalent functionality.'