我有如下函数定义:
Function Parameterless() as String
它没有覆盖或重载。以下行将愉快地编译并运行:
Dim s as String = Parameterless(1)
发生了什么事?
最佳答案
这里发生的事情确实很奇怪,而且是 VB.NET 的怪事。
方法和索引器都使用 ()
调用(与 C# 使用 []
不同)。由于向下兼容,这些括号不是强制性的。您可以调用任何不带任何参数的方法。所以你可以使用:
Dim s As String = Parameterless
你可以使用(为此推荐)
Dim s As String = Parameterless()
但是为什么即使没有重载也可以使用Parameterless(0)
?因为该方法返回一个具有索引器的 String
。因此,如果您想要返回字符串的第一个字符,您可以使用(推荐):
Dim firstLetter As Char = Parameterless()(0)
或(不推荐,但您的情况)
Dim firstLetter As Char = Parameterless(0)
这是可行的,因为没有重载,并且 VB.NET 编译器决定您要调用不带参数的方法,然后您要在字符串上使用索引器。
如果该方法不返回字符串(或任何其他具有索引器的类型),而是例如整数,则会出现编译器错误。
- 在 VB.NET 中,他们称之为 Default properties
- 在 C# 中它们被称为 Indexer
关于VB.Net 无参数方法似乎正在接受参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46663189/