|
法必须带有specialname属性。那么我们完全可以骗过编译器,不用它提供的Operator关键字来声明运算符重载过程,而是使用自己编写特定名称的方法,并加以specialname的手法来打造运算符重载过程: Imports System.Runtime.CompilerServices
Class Functor(Of T, U) <SpecialName()> _ Public Shared Function op_BitwiseAnd(x As Functor(Of T, Boolean), y As Functor(Of T, Boolean)) _ As Functor(Of T, Boolean) End Function End Class System.Runtime.CompilerServices.SpecialNameAttribute是一个指示编译器为声明成员添加specialname的特殊属性,C#和VB编译器都支持。op_BitwiseAnd是VB和C#等语言所识别的与操作运算符过程名称。这样写完以后编译成类库,再以引用DLL的方式引用它,你就会看到编译器将他识别成了我们要的运算符重载过程。当你在Functor<T, int>这样的类型上使用And操作时,编译器会告诉你不支持该运算符,仅在Functor<T, bool>上才能进行这一操作,编译错误信息准确无误,真是太棒了。 在我们结束前,我们还可以看看如此手工打造还能突破哪些编译器人为的限制: 可重载Protected和Private的运算符(尽管这样做几乎没有意义) 可不成对重载比较运算符(=, >, >=, <=, <, <>) 可以让移位运算符的第二个操作数不是int(>>和<<样子很好看,但是有了这个限制我们就不能拿它来干别的事情,现在好了) 可以在C#中重载仅VB支持的运算符,也可以在VB中重载仅C#支持的运算符(当然要到对方语言中才能生效) 可以让用户自定义显式转换支持泛型类型参数之间更加神奇的写法 用了这种手法,似乎还可以重载诸如operator+(int, int)之类的运算符,但它们并不能生效。 .NET语言编译器中每一项特性,都可能有隐藏在其表面之下的深层次用途。善加研究后常能发现原来所认识不到的功能。我当然不是在推荐大家乱用运算符重载,只是一种思考,一种新的灵感 上一页 [1] [2]
|