我有一个这样的课程:
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。
答案 0 :(得分:10)
您的公共方法将对象作为参数,您的私有方法采用字符串/整数。所以运行时不知道它应该使用哪个重载方法。
如果您创建所有重载方法public
,则只有Option Strict关闭时才会编译代码。然后在运行时,不会抛出异常迁移,因为对象的实际类型将通过后期绑定(或者甚至是静默地转换为匹配类型,从date
到string
)来检测。但是,请尽量避免使用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:
主要是,我们不允许调用任何扩展方法 静态类型为“对象”的表达式。这对于防止任何>是必要的。现有的后期绑定代码,您可能已经被扩展方法破坏了