VB.NET 对运算法支持的还是不够彻底

时间:2022-05-28 23:41:03
一个简单的例子:

VB.NET 对运算法支持的还是不够彻底Dim  pt  As   New  Point( 0 0 )
VB.NET 对运算法支持的还是不够彻底pt 
+=   New  Size( 10 10 )
VB.NET 对运算法支持的还是不够彻底

C# 中没有问题。在 VB.NET 中就不能编译,错误是
 
Operator '+' is not defined for types 'System.Drawing.Point' and 'System.Drawing.Size'.

其实看一下 Point 的il 代码,已经有了一个加法的重载

VB.NET 对运算法支持的还是不够彻底.method  public  hidebysig specialname  static  
VB.NET 对运算法支持的还是不够彻底        valuetype System.Drawing.Point  op_Addition(valuetype System.Drawing.Point pt,
VB.NET 对运算法支持的还是不够彻底                                                    valuetype System.Drawing.Size sz) cil managed
VB.NET 对运算法支持的还是不够彻底VB.NET 对运算法支持的还是不够彻底
{
VB.NET 对运算法支持的还是不够彻底  
// Code size       36 (0x24)
VB.NET 对运算法支持的还是不够彻底
  .maxstack  8
VB.NET 对运算法支持的还是不够彻底  IL_0000:  ldarga.s   pt
VB.NET 对运算法支持的还是不够彻底  IL_0002:  call       instance int32 System.Drawing.Point::get_X()
VB.NET 对运算法支持的还是不够彻底  IL_0007:  ldarga.s   sz
VB.NET 对运算法支持的还是不够彻底  IL_0009:  call       instance int32 System.Drawing.Size::get_Width()
VB.NET 对运算法支持的还是不够彻底  IL_000e:  add
VB.NET 对运算法支持的还是不够彻底  IL_000f:  ldarga.s   pt
VB.NET 对运算法支持的还是不够彻底  IL_0011:  call       instance int32 System.Drawing.Point::get_Y()
VB.NET 对运算法支持的还是不够彻底  IL_0016:  ldarga.s   sz
VB.NET 对运算法支持的还是不够彻底  IL_0018:  call       instance int32 System.Drawing.Size::get_Height()
VB.NET 对运算法支持的还是不够彻底  IL_001d:  add
VB.NET 对运算法支持的还是不够彻底  IL_001e:  newobj     instance 
void System.Drawing.Point::.ctor(int32,
VB.NET 对运算法支持的还是不够彻底                                                                 int32)
VB.NET 对运算法支持的还是不够彻底  IL_0023:  ret
VB.NET 对运算法支持的还是不够彻底}
  //  end of method Point::op_Addition
VB.NET 对运算法支持的还是不够彻底


无奈只好改成:
VB.NET 对运算法支持的还是不够彻底         Dim  pt  As   New  Point( 0 0 )
VB.NET 对运算法支持的还是不够彻底        pt 
=  Point.op_Addition(pt,  New  Size( 10 10 ))
VB.NET 对运算法支持的还是不够彻底

查了一下,msdn mag 最新的一期提到了这个问题,其实原因很简单,vb.net 的compiler 还没有100% 对运算符重载支持的足够好。

原文地址:http://www.msdn.microsoft.com/msdnmag/issues/04/12/AdvancedBasics/default.aspx