.net “公众会员”&书信电报;方法>&引用;“类型”的&书信电报;模块>&引用;尽管调用在内部执行,但未找到

.net “公众会员”&书信电报;方法>&引用;“类型”的&书信电报;模块>&引用;尽管调用在内部执行,但未找到,.net,vb.net,visual-studio-2010,polymorphism,.net,Vb.net,Visual Studio 2010,Polymorphism,我编写了一个模块,如下所示: Public Module aModule Private Sub doSomethingRelevant() Dim s As String = "foo" Dim o As Object = s aModule.performCrashyThing(s) ' Success aModule.performCrashyThing(o) ' Error End Sub Private Sub performCrash

我编写了一个模块,如下所示:

Public Module aModule

  Private Sub doSomethingRelevant()
    Dim s As String = "foo"
    Dim o As Object = s
    aModule.performCrashyThing(s) ' Success
    aModule.performCrashyThing(o) ' Error
  End Sub

  Private Sub  performCrashyThing(s as String)
    ' Blah blah
  End Sub

  Private Sub  performCrashyThing(l as Long)
    ' Blah blah
  End Sub

End Module
第二个调用
performCrashyThing(o)
引发异常:

找不到类型为“aModule”的公共成员“performCrashyThing”


如果我打开这个子程序
Public
(不使用
Long
参数触摸第二个子程序),它不会抱怨。我不明白,因为调用是在模块内部执行的。

正如我在上面的评论中所说的,这里有一个选项:
(但您需要始终启用并更改您的方法)

不确定传递对象时要完成什么。这里有一些值得思考的东西。我添加了一个performCrashyThing的对象方法,该方法确定应该调用哪个特定的performCrashyThing

Public Module aModule

    Public Sub doSomethingRelevant()
        Dim s As String = "foo"
        Dim o As Object = s
        aModule.performCrashyThing(s)
        aModule.performCrashyThing(o)
        o = 1L
        aModule.performCrashyThing(o)
    End Sub

    Private Sub performCrashyThing(obj As Object)
        If TypeOf obj Is String Then
            performCrashyThing(DirectCast(obj, String))
        ElseIf TypeOf obj Is Long Then
            performCrashyThing(DirectCast(obj, Long))
        Else
            Stop
        End If
    End Sub

    Private Sub performCrashyThing(s As String)
        ' Blah blah
    End Sub

    Private Sub performCrashyThing(l As Long)
        ' Blah blah
    End Sub

End Module

在Option Strict ON指令下,您不能这样做。关闭你的选项。但作为建议,请使用对象创建第三个子对象(同名)parameter@G3nt_M3caj谢谢(我也更喜欢第三个子解决方案)。是否有一些文档解释了为什么这是被禁止的(特别是解释了为什么将子例程公开会产生影响)?没有关于公共或私有的问题。在这里,我们讨论的是正确的编程机制。运行时会出现许多错误(编译器会避免这些错误)。但为了确保应用程序能够完美运行,我们需要对选项进行严格限制。这样,编译器会告诉我们“嘿,伙计,运行时可能有错误”。请看这里@G3nt\U M3caj,我在您的答案下回答了。没有带有对象签名的performCrashyThing。谢谢,我了解该示例涉及后期绑定,我阅读了您在我的问题下方发布的链接。但是我仍然不明白为什么将
公开
子组件“解决”了错误(即不再显示)。我不知道你的VS版本是什么。但是错误参数的错误(使用选项Strict on)出现在VS 13、VS 17和VS 19中。我现在用的是Ide。也许你有一个旧的VS和旧的编译器/框架(MSVC)在里面。VS 2010,因为遗留的原因。(添加了一个标签以防万一。)我还安装了VS2005。即使在这一版本的VS中,错误也总是显示在选项Strict On下,这也会使公共Sub变得有趣。我可能在写这个MVCE的时候漏掉了一点。使用反射是更复杂的事情。我循环遍历一些对象属性并将它们传递给子对象。属性是有限类型集,相关子对象将根据属性类型进行调用。你是在建议G3nt_M3caj在我的问题下面的评论中所建议的。@Amesshel-那你为什么要使用Object?除了OP中Object类型的“o”之外,您的代码工作正常。因为当您想要检索通过反射获得的给定属性的值时,您最终使用的是
PropertyInfo.GetValue()
,它返回一个
对象
实例。我尝试了一个强制转换(类似于
Convert.ChangeType(pi.GetValue(),pi.GetType())
但它没有改变任何东西)。当然,我可能做错了。