2

我有以下用 VB.NET 编写的方法:

Public Shared Function formatClassNameAndMethod(ByVal prefix As String, ByVal stackFrame As StackFrame) As String

        Dim methodBase As MethodBase = StackFrame.GetMethod()

        Return prefix + ":[" + stackFrame.GetMethod().DeclaringType.Namespace + "][" + stackFrame.GetMethod().DeclaringType.Name + "." + methodBase.Name + "] "

End Function

我使用代码移植工具将其转换为 C#。它产生了以下方法:

public static string formatClassNameAndMethod(string prefix, StackFrame stackFrame)
{
    MethodBase methodBase = StackFrame.GetMethod();

    return prefix + ":[" + stackFrame.GetMethod().DeclaringType.Namespace + "][" + 
            stackFrame.GetMethod().DeclaringType.Name + "." + methodBase.Name + "] ";
}

不幸的是,Visual Studio 现在给了我以下错误:

无法在静态上下文中访问非静态方法“GetMethod”

它抱怨是StackFrame.GetMethod()因为该方法不是静态的。为什么会这样?我明白错误是什么,但我不明白为什么我没有在 VB.NET 中得到这个。VB.NET 中的 Shared 和 C# 中的 static 的工作方式有区别吗?转换工具没有正确转换吗?

4

2 回答 2

8

GetMethod不是静态的。这就是它告诉你的。

这意味着您需要先创建一个实例,然后才能调用该方法。您的方法已经StackFrame传入了一个实例。这只是区分大小写的情况。小写S

public static string formatClassNameAndMethod(string prefix, StackFrame stackFrame)
{ //                                                                     ^^^ this
    MethodBase methodBase = stackFrame.GetMethod();
    //                     ^^ lowercase S
于 2013-10-09T21:57:59.490 回答
4

VB 不区分大小写 - 编译器看到“StackFrame.GetMethod()”并说“哦,开发人员一定是指“stackFrame.GetMethod()”。

于 2013-10-10T04:27:16.517 回答