vb.net – 为什么在从同一个类的共享函数调用时,无法访问重载的私有共享函数

vb.net – 为什么在从同一个类的共享函数调用时,无法访问重载的私有共享函数,第1张

概述碰到了我发现有趣的东西,并希望得到一个解释. 编辑 这个问题并不是要回答应该采取什么措施来解决它.我知道修复.我想要解释为什么编译器会做它的功能.防爆.在这种情况下,是否考虑了私有功能? 问题 我有一个类,它有一个名为WhatIs的公共共享(静态)函数. WhatIs采用具有对象集合的参数.代码遍历此集合并调用具有参数匹配类型的WhatIs函数. 执行时,抛出InvalidCastExceptio 碰到了我发现有趣的东西,并希望得到一个解释.

编辑

这个问题并不是要回答应该采取什么措施来解决它.我知道修复.我想要解释为什么编译器会做它的功能.防爆.在这种情况下,是否考虑了私有功能?

问题

我有一个类,它有一个名为WhatIs的公共共享(静态)函数. WhatIs采用具有对象集合的参数.代码遍历此集合并调用具有参数匹配类型的WhatIs函数.

执行时,抛出InvalIDCastException异常,因为执行试图调用启动它的WhatIs函数,而不是所提供类型的函数.

这很奇怪,但是让我感到奇怪的是当你将私有共享函数更改为public共享时,它工作正常.

甚至更奇怪,当你明确地施放对象时,即使该函数是私有的,它也能工作.

什么?!有人请解释一下

胆量:

Public Class House    Public Property Furniture As ICollection(Of Object)    Public Sub New()        Furniture = New List(Of Object)    End SubEnd ClassPublic Class Chair    Public Property IsComfortable As BooleanEnd ClassPublic Class table    Public Seats As IntegerEnd ClassPublic Class Houseexaminer    Public Shared Function WhatIs(thing As House) As String        Dim isA As String = "a house that contains "        For Each item In thing.Furniture            isA &= WhatIs(item)        Next        Return isA    End Function    Private Shared Function WhatIs(thing As Chair) As String        Return "a " & If(thing.IsComfortable,"comfortable","uncomfortable") & " chair "    End Function    Private Shared Function WhatIs(thing As table) As String        Return "a table that seats " & thing.Seats & " iguanas"    End FunctionEnd Class

去测试

imports System.Textimports Microsoft.VisualStudio.TestTools.UnitTestingimports stuff<TestClass()>Public Class HouseexaminerTests    <TestMethod()>    Public Sub TestWhatIs()        Dim given As New House()        Dim expected As String        Dim actual As String        given.Furniture.Add(New Chair() With {.IsComfortable = True})        given.Furniture.Add(New table() With {.Seats = 4})        expected = "a house that contains a comfortable chair a table that seats 4 iguanas"        actual = Houseexaminer.WhatIs(given)        Assert.Equals(expected,actual)    End SubEnd Class

结果

调试测试,你得到这个:
InvalIDCastException的
方法调用失败,因为“公共共享函数WhatIs(thing as stuff.House)As String”无法使用以下参数调用:

参数匹配参数’thing’无法从’Chair’转换为’House’.

这些变化使它工作,但为什么?!

让他们公开

将Houseexaminer中的私有共享功能更改为public,重新运行测试.扰流板,它的工作原理

显式地转换对象

将它们更改为私有然后替换

isA &= WhatIs(item)

If TypeOf item Is Chair Then isA &= WhatIs(CType(item,Chair))If TypeOf item Is table Then isA &= WhatIs(CType(item,table))

重新运行测试,你知道什么,它的工作原理

解决方法@H_502_71@ 首先,看起来您已启用隐式转换.这是问题的开始.其次,将Furniture定义为List(对象).你第一次打电话给WhatIs是成功的.编译器正在最好地猜测当它通过thing.Furniture迭代时传递它所看到的简单对象时使用哪个重载,并且它确定最合适的WhatIs方法的公共静态版本.然后它尝试隐式地将Object转换为House,并且不可避免地失败.

为什么铸造工作?因为它需要猜测工作来确定使用哪个重载.

故事的道德是:不要让编译器猜测.隐式转换可能会导致棘手的错误.

编辑:为什么编译器看不到其他重载函数?

编译器必须确定在编译时使用的正确重载.它不会等到运行时才能确定要使用哪个重载,因此无需检查对象的类型以确定最合适的重载.

由于编译器只知道家具是List(Of Object),从技术上讲(启用隐式转换)所有三个重载都被认为是“合适的”,但编译器必须选择一个.它对可能的超载候选者进行排名,并在私有版本之前选择公共版本.

总结

以上是内存溢出为你收集整理的vb.net – 为什么在从同一个类的共享函数调用时,无法访问重载的私有共享函数全部内容,希望文章能够帮你解决vb.net – 为什么在从同一个类的共享函数调用时,无法访问重载的私有共享函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1232972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存