2012-11-20 120 views
0

我做了VB.net中一个简单的例子,它编译并运行它:虽然它编译罚款简单的VB代码没有运行

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 
+0

当你取消对'For'循环有什么编译错误? – Ryan

+0

很多错误,第一个错误是'End For'。它表示预期的“Sub”,预期的结束语句,预期的“结束”,预期的语句结束。说后的所有行无效作为标识符。 – NoBugs

+5

噢,它不是'End For',它是'Next'。 'while ... End While','Do ... Loop','For ... Next','For Each ... Next'。 – Ryan

回答

1
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 
3

而不是End For在您的评论循环中,您需要使用Next

其他部分是编译器错误,而不是你的错。 mono vb编译器仍然需要一些工作。如果我不得不猜测,我会说这里的问题要么是它看到你的方法没有真正的工作,并试图对Datetime.Now的两种用法做出不好的优化,或者它使用DateTime的错误重载。减去呼叫...但是,这些只是猜测。

但是,您应该做的是使用System.Diagnostics.Stopwatch类而不是日期时间值。

4

运行时错误是因为您正在从共享函数(Main)调用实例函数(calc1)。

较新版本的VBNC(Mono的VB编译器)的为您提供了这个错误:

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 
+0

好抓!它应该是一个'模块'... – Ryan

+0

那么,'共享'相当于静态?我想知道那是为了什么。 .NET中的Class和Module有什么区别? (我对Java更熟悉,我很少完成VB.NET) – NoBugs

+0

是的,Shared与C#/ Java中的静态相同。 VB中的模块是一个所有成员都是共享的类(与C#中的静态类相同)。 –