我正在编写一个编译器(仅仅是为了好玩),我决定在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用户有什么建议吗?也许是我失踪的编译器开关或其他东西。是否可以强制编译器仅使用编译时解析而不是运行时解析?似乎编译器在编译时无法找到适当的重载,因此它会将其保留到运行时。
我使用在线编译器进行这些测试。