我得到了一个Utility模块,因为VB.NET没有像C#那样的静态类,模块是VB.NET中的静态类,我使用模块的原因是因为我使用的是扩展方法,它只能在模块中使用。
我不能引用这个模块,但是如果我把我的代码放在一个类中。我可以毫不费力地参考它。可能的原因是什么?我想C#了。
编辑:模块在调用Utility的类库中。
发布于 2009-01-12 19:45:55
您需要将该模块标记为公共模块。
发布于 2009-01-13 07:12:53
.NET编译器可以采用任何类型的语言语法,并将其转换为.NET等效项。有时会有一对一的通信,其他时候则没有。
通过使用.NET Reflector,您可以看到编译器真正在做什么。
在VB.NET中,该模块之所以存在,是因为继承自Visual BASIC,部分继承自Microsoft BASIC。
VB.NET编译器将接受以下内容
Public Module CoreModule
Dim R As New System.Random(CInt(Microsoft.VisualBasic.Timer))
Public Function D(ByVal Roll As Integer) As Integer
Return R.Next(0, Roll) + 1
End Function
Public Function _1D6() As Integer
Return D(6)
End Function
Public Function _2D6() As Integer
Return D(6) + D(6)
End Function
Public Function _3D6() As Integer
Return D(6) + D(6) + D(6)
End Function
Public Function _4D6() As Integer
Return D(6) + D(6) + D(6) + D(6)
End Function
Public Function CRLF() As String
Return Microsoft.VisualBasic.ControlChars.CrLf
End Function
End Module
并将其转换成这样(为简洁起见,省略了代码)
Public NotInheritable Class CoreModule
' Methods
Shared Sub New()
Public Shared Function _1D6() As Integer
Public Shared Function _2D6() As Integer
Public Shared Function _3D6() As Integer
Public Shared Function _4D6() As Integer
Public Shared Function CRLF() As String
Public Shared Function D(ByVal Roll As Integer) As Integer
' Fields
Private Shared R As Random
End Class
在C#中,等效项是
public sealed class CoreModule
{
// Fields
private static Random R;
// Methods
static CoreModule();
public static int _1D6();
public static int _2D6();
public static int _3D6();
public static int _4D6();
public static string CRLF();
public static int D(int Roll);
}
重要的是发出的CIL是否正确地完成了工作。
这种能力是为什么许多老的Visual basic6程序员对微软对该语言的更改感到非常恼火的主要原因。例如,关键字Integer发出Int32而不是Int16。
只要模块声明为公共模块,模块就会向引用原始程序集的其他程序集公开。
发布于 2009-01-12 19:19:14
也许方法/subs不是公开的?我曾经遇到过这样的问题,它会允许访问你的类中的本地代码,但如果它在你的类之外并标记为"Private“,就不允许访问。
https://stackoverflow.com/questions/436605
复制相似问题