为什么我不能从vb.net中的公共共享方法调用私有共享方法?

gpi*_*kas 5 .net vb.net asp.net

我有一个这样的课:

class Foo
    private shared default_ = "DEFAULT"

    public shared function bar(val as object) as string
        if val is Nothing then return _default

        return getBar(val)
    end function

    private shared function getBar(val as string) as string
        return formatString(val)
    end function

    private shared function getBar(val as System.Int32) as string
        return formatInt(val)
    end function
end class
Run Code Online (Sandbox Code Playgroud)

formatString和FormatInt是公共共享方法.当我调用Foo.bar时,我得到一个MissingMemberException:

System.MissingMemberException: Public member 'getBar' on type 'Foo' not found.
Run Code Online (Sandbox Code Playgroud)

当我将getBar方法公开时,它可以工作,但我不想不必要地公开它们.为什么我不能从同一个类中的公共方法调用私有共享方法.

我在Web应用程序中使用.net framework 4.0.

Tim*_*ter 10

您的公共方法将对象作为参数,您的私有方法采用字符串/整数.所以运行时不知道它应该使用哪个重载方法.

如果您创建所有重载方法public,则只有在Option Strict Off时才会编译代码.然后在运行时migth抛出也不例外,因为对象的实际类型将通过结合晚期(或甚至默默地浇铸到一个匹配的类型,从FE被检测datestring).但尽管如此,避免后期绑定使用Option Strict On,并使用VB.NET因为它应该是:一个强类型语言.

主原因,为什么你的代码抛出一个MissingMemberExceptionOption Strict Off和私有方法是:

您可以检查类型val,将对象强制转换为此类型,然后将该参数传递给正确的方法.例如:

Public Overloads Shared Function bar(ByVal val As Object) As String
      If val Is Nothing Then Return default_

      If TypeOf val Is String Then
          Return getBar(CStr(val))
      ElseIf TypeOf val Is Int32 Then
          Return getBar(CInt(val))
      Else
          Return default_
      End If
End Function
Run Code Online (Sandbox Code Playgroud)

另一点:如果您打算创建一个接受对象的扩展方法,请忘记它:

主要是,我们不允许从静态类型为"Object"的任何表达式中调用扩展方法.这对于防止您可能编写的任何>现有的后期绑定代码被扩展方法破坏是必要的