【问题标题】:Why can't I call private shared methods from a public shared method in vb.net?为什么我不能从 vb.net 中的公共共享方法调用私有共享方法?
【发布时间】:2011-08-25 09:23:38
【问题描述】:

我有这样的课程:

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。

【问题讨论】:

  • 看到几乎所有内容都以小写字母开头的 VB 代码感觉很奇怪。
  • @BoltClock - 就像 VB 想要成为 C# 一样,反之亦然? :)
  • 嗯,VB.Net 最好的一点是,我不必遵循 M$ 编码风格... :)

标签: .net asp.net vb.net


【解决方案1】:

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

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

主要原因为什么您的代码会使用 Option Strict Off 和私有方法抛出 MissingMemberException

您可以检查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

还有一点:如果你打算创建一个带对象的Extension-Method,forget it

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

【讨论】:

  • 我以为我在使用 strict,因为我在 @Page 指令中使用了它,但这显然不会传播到 App_Code 目录。
  • 你描述的第一个方法正是我以前的方法,但是我必须检查 Int32、Int64、Byte 等,有 20 个 case 选项......丑陋。
  • @gpinkas:如果您为每种类型重载此方法,您可以简单地将这些函数公开。这样你就不需要对对象进行类型检查,因为总是调用正确的对象。
  • 顺便说一句,感谢您的详细回答,但我仍然不明白为什么 getBar 方法是私有/公共时会有差异。
  • @Tim:重载函数本身是有问题的,因为我无法为 Object 提供重载。但我也需要这个作为默认值的后备。
猜你喜欢
  • 2011-06-21
  • 2012-12-05
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 2016-12-26
  • 2014-08-06
相关资源
最近更新 更多