Простой код VB не работает
Я сделал простой пример на VB.net, скомпилировал его и запустил:
Public Class Application
Sub calc1()
Dim sq as Integer
'uncommenting this loop keeps it from compiling for some reason
'For i as Integer = 1 to 1000
' sq = i*i
'End For
Console.WriteLine("calculated squares")
End Sub
Public Shared Sub Main()
Dim startTime as DateTime
Dim endTime as DateTime
System.Console.WriteLine("Hello world!")
startTime = Now
calc1()
endTime = Now
Console.WriteLine(endTime.Subtract(startTime).TotalSeconds.ToString("0.0000"))
End Sub
End Class
Хотя он хорошо компилируется, он выдает странную ошибку при запуске:
Unhandled Exception: System.InvalidProgramException: Invalid IL code in ThreadTest.Application:Main (): IL_0018: ldarg.0
[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidProgramException: Invalid IL code in ThreadTest.Application:Main (): IL_0018: ldarg.0
3 ответа
Ошибка во время выполнения вызвана тем, что вы вызываете функцию экземпляра (calc1) из общей функции (Main).
Более новые версии vbnc (VB-компилятор Mono) выдают эту ошибку:
test.vb (16,15) : error VBNC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
Этот исправленный код работает:
Public Class Application
Shared Sub calc1()
Dim sq as Integer
For i as Integer = 1 to 1000
sq = i*i
Next
Console.WriteLine("calculated squares")
End Sub
Public Shared Sub Main()
Dim startTime as DateTime
Dim endTime as DateTime
System.Console.WriteLine("Hello world!")
startTime = Now
calc1()
endTime = Now
Console.WriteLine(endTime.Subtract(startTime).TotalSeconds.ToString("0.0000"))
End Sub
End Class
Вместо End For
в вашем цикле комментариев, вы должны использовать Next
,
Другая часть этого - ошибка компилятора, а не ваша ошибка. Моно VB компилятор все еще нуждается в некоторой работе. Если бы мне пришлось угадывать, я бы сказал, что проблема здесь либо в том, что он видит, что ваш метод не работает, и пытается выполнить плохую оптимизацию с двумя вашими использованиями Datetime.Now, либо в том, что он использует неправильную перегрузку для DateTime. Вычитаем... но опять же, это всего лишь догадки.
Однако вы должны использовать класс System.Diagnostics.Stopwatch, а не значения Datetime.
Main function is required in file like as below :
Public Class Application
Public Shared Sub calc1()
Dim sq As Integer
'uncommenting this loop keeps it from compiling for some reason
'For i as Integer = 1 to 1000
' sq = i*i
'End For
Console.WriteLine("calculated squares")
End Sub
End Class
Sub Main()
Dim startTime As DateTime
Dim endTime As DateTime
System.Console.WriteLine("Hello world!")
startTime = Now
Application.calc1()
endTime = Now
Console.WriteLine(endTime.Subtract(startTime).TotalSeconds.ToString("0.0000"))
Dim inputFromConsole As String
Dim outputToConsole As String
Console.WriteLine("Type in a sentence and hit Enter:")
inputFromConsole = Console.ReadLine()
Console.WriteLine(outputToConsole)
End Sub