vb.net重载选择算法似乎与文档

时间:2017-01-20 01:36:17

标签: vb.net language-lawyer overload-resolution

我正在编写一个编译器(仅仅是为了好玩),我决定在vb.net上建立重载解析逻辑。

根据MSDN文档

Overload Resolution (Visual Basic)

所以我对此的解释是,编译器将拒绝需要缩小数据类型的函数

仅选择需要最小扩展量的函数

直到只有一个候选函数保留,或者如果候选列表中剩余多个函数,则失败(不明确)。好的,这一切都很有意义。我假设它可以防止缩小以防止数据丢失。

但是下面的VB程序编译得很好。由于缩小规则,我期待编译器时间错误。它编译时没有错误或警告但总是在运行时崩溃。我无法看到该程序如何正常运行,但编译器并没有抱怨。

Module VBModule

  Sub z(a as long, b as single)
    Console.WriteLine("long a, single b")
  End Sub

  Sub z(a as short, b as double)
    Console.WriteLine("short a, double b")
  End Sub

  Sub z(a as integer, b as double)
    Console.WriteLine("integer a, double b")
  End Sub

  Sub Main()
    Console.WriteLine("Hello, world!")
    dim p as long
    dim q as double

    p = 1
    q = 1

    ' all the available versions of z() will result in data loss, so I 
    ' was expecting a compile time error for this call.
    call z(p, q)
  End Sub

End Module

等效的Java程序(java使用类似的重载解析规则,即不允许缩小)在编译时会抱怨,这是我对vb的预期。

public class HelloWorld
{
  public static void z(long a, float b) {
    System.out.println("long, float");
  }

  public static void z(short a, double b) {
    System.out.println("short, double");
  }

  public static void z(int a, double b) {
    System.out.println("int, double");
  }

  public static void main(String []args) {
    System.out.println("Hello World");

    // this fails to compile in both java and vb.net
    /*{
      short p;
      short q;

      p = 1;
      q = 1;

      z(p, q);
    }*/

    // this fails to compiler in Java, which is what I expected.  
    // It compiles OK in Vb net but bombs with a runtime error,
    // not sure why the vb compiler doesn't complain at compiler 
    // time!!!!!
    {
      long p;
      double q;

      p = 1;
      q = 1;

      z(p, q);
    }  
  }
}

你们中的任何一个vb.net用户有什么建议吗?也许是我失踪的编译器开关或其他东西。是否可以强制编译器仅使用编译时解析而不是运行时解析?似乎编译器在编译时无法找到适当的重载,因此它会将其保留到运行时。

我使用在线编译器进行这些测试。

Visual Basic Online Compiler

Java Online Compiler

0 个答案:

没有答案