VB.NET语法和字符串扩展方法

8

使用VB.NET编写代码

Module Utils
<Runtime.CompilerServices.Extension()> _
Public Sub Print(ByVal message As String)
    Console.WriteLine(message)
End Sub
End Module

Public Class Foo
Public Sub New()
    Dim test = "cucu"
    test.Print() ' no problem: custom string extension method '
    "cucu".Print() ' syntax error '
End Sub
End Class

1) 第一个问题,我希望能够使用 "cucu".MyExtensionMethod() 和 test.MyExtensionMethod();

1') 像下面这样的语法

  "No Result".Print() ' Print is an extension method '
  " No Result ".Trim() ' Trim is a framework method '

这两个都不起作用

然而,像下面这样的语法

  myTextBox.Text = "No Result".Translate() ' Translate is an extension method '
  myTextBox.Text = " No Result ".Trim() ' Trim is a framework method '

运行得非常好。

所以似乎存在一些字符串常量行为的一致性问题。

2)看一下附带图片中的注释(COMMENTS)。单词“custom”,“string”和“error”被突出显示,但它们在注释中,所以应该是绿色的,而不是蓝色的。

为什么会这样?有什么解决方法吗?

编辑:

Microsoft Connect中被宣布为“错误”(即使只是一种句法上的“错误”)......

编辑2:

正如Hans Passant所指出的,标准的字符串方法,如"cucu".Trim()也无法正常工作。


1
嗯,解决方法是像你对test做的那样将它赋值给一个变量吗? - BoltClock
@BoltClock ))))好的,为什么这样?)) - serhio
1
你怎么这么确定它已经是一个 bug 了? - BoltClock
请编辑您的错误报告,包括一个完整的“可工作”示例,并提供逐步说明以重现该问题。否则,微软可能不会理睬它。 - Konrad Rudolph
2
这与扩展方法无关,"blah".Trim() 也不起作用。 - Hans Passant
显示剩余4条评论
2个回答

10

我可以确认这确实是一个“漏洞”(测试于Visual Studio 2008),但事实上,在VB中这是一种设计,不会被更改。

然而,我想花时间解释为什么这是一个糟糕的问题。抱歉Serhio。

  1. 它没有列出重现问题所需的所有步骤。
  2. 它没有提供完整的代码。
  3. 它没有将问题简化到最小程度(不要在此处使用Infer - 它会减弱问题)。
  4. 因此,有一百个不同的原因可以完全解释此行为,而无需漏洞(例如,请参见stakx的出色的(现已删除的)答案)。

以下是一个完整的示例,使用VB的默认设置,没有这些问题(创建一个新的空控制台项目解决方案,并将此代码粘贴到Module1.vb中):

Module Extensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Sub ShowDialog(ByVal message As String)
        Console.WriteLine(message)
    End Sub
End Module

Module Module1
    Sub Main()
        Dim s As String = "Hello"
        s.ShowDialog()
        ' Doesn’t work:
        '"World".ShowDialog()
        ' Works:
        Call "World".ShowDialog()
    End Sub
End Module

在VB中,这种行为是一致的:你不能把一个值作为逻辑行的第一个标记。例如,下面的代码也无法编译(假设已经存在一个合适的表单类Form1的定义):

New Form1().ShowDialog()

再次提醒,解决方法是在表达式前加上Call

Call New Form1().ShowDialog()

修改了一些你的评论)...我知道这可能不是一个真正的问题。我只是想分享一下这个“问题”。 - serhio

3

您可以执行CStr("cucu").ShowDialog()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接