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

时间:2011-08-25 09:23:38

标签: .net asp.net vb.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

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

System.MissingMemberException: Public member 'getBar' on type 'Foo' not found.

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

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

1 个答案:

答案 0 :(得分:10)

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

如果您创建所有重载方法public,则只有Option Strict关闭时才会编译代码。然后在运行时,不会抛出异常迁移,因为对象的实际类型将通过后期绑定(或者甚至是静默地转换为匹配类型,从datestring)来检测。但是,请尽量避免使用Option Strict On late binding并使用VB.NET,因为它应该是:强类型语言

主要原因为什么您的代码会抛出MissingMemberException Option 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

另一点:如果您打算创建一个带有对象的扩展方法,forget it

  

主要是,我们不允许调用任何扩展方法   静态类型为“对象”的表达式。这对于防止任何>是必要的。现有的后期绑定代码,您可能已经被扩展方法破坏了