当 CLSCompliant(true) 时,运算符不应该重载 C#?
When CLSCompliant(true) , Operators should not be overloaded C#?
当 CLSCompliant(true) 时,基本规则之一:"Operators should not be overloaded"。
请让我知道,以上说法是真还是假。说明原因。
CLS
代表Common Language Specification
。问题是 CLS
是 IL
特性的一个子集,所有 .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.'
当 CLSCompliant(true) 时,基本规则之一:"Operators should not be overloaded"。 请让我知道,以上说法是真还是假。说明原因。
CLS
代表Common Language Specification
。问题是 CLS
是 IL
特性的一个子集,所有 .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.'