.net 操作符相关 笔记

c#中操作符重载:

class Test
{
public static Test operator + (Test arg1,Test arg2){...}
}

虽然CLR对操作符一无所知,但它却规范了编程语言应该怎样提供操作符重载,以使它们可以很容易地被不同的编程语言编写的代码所使用,每个编程语言自己决定是否支持操作符重载,以及如果提供,表达和使用它们的语法是怎样的,对于CLR来讲,操作符重载仅仅是一些方法而已。

当编辑如果代码时,编辑器会产生一个名为op_Addition的方法定义;该方法定义条目上有一个specialname标记,表示这是一个"特殊"的方法。当编辑器(包括C#编辑器)看到源代码中的+操作符时,它们会去看其中的操作数类型中有哪一个定义了参数类型和操作数类型兼容、名为op_Addition的specialname方法。如果存在这样的方法,编译器就会调用方法,如果不存在,则会出现编译错误。

操作符与语言互操作性:

操作符重载是一个很有用的工具,它能够通过简洁的语法来表达自己的思想。但不是很一种编程语言都支持操作符的重载,比如Visual Basic ,所以当Visual Basic开发人员在一相非基元类型(Visual Basic认为的)上应用+操作符时,编译器将产生一个错误,并停止运行。这样就产生了一个问题,一个使用不支持操作符重载语言的开发人员怎么去调用另一个支持操作符重载的语言定义类型呢?

以Visual Basic 与 C# 为例(Visual Basic 不支持操作符的重载,而c#支持):

1.在Visual Basic 里没有操作符的重载,但是提供了一个op_Addition(相当于+)方法;

首先建一个vb的类库并新建一个VbType的类,类的内容如下:

Public Class VbType

Public Shared Function op_Addition(ByVal a As VbType, ByVal b As VbType) As String
Return "operator + "
End Function

End Class

2.在 c#里对上面类型的实例进行+操作

using System;

class Program
{
static void Main(string[] args)
{
//这样操作是错误的
//不能通过编译
Console.WriteLine(vb+vb);

//只能通过这样的方法来访问
Console.WriteLine(VbType.VbType.op_Addition(vb,vb));
}
}

之所以不能用+ 来操作两个实例的原因是:当c #编译器遇到+时,就会到元数据中去查找带有specialname的元数据标记的op_Addition方法,编译器才能确定这是一个操作符重载的方法,但是vb产生的op_Addition方法没有specialname标记,所以编译器会报错。

相反,如果是在c#中定义了一个+操作符的重载,在vb里面进行实例的+操作的话,也只能调用op_Addition方法。

原文地址:https://www.cnblogs.com/challengesoflife/p/2336527.html