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

时间:2011-08-30 10:57:29

标签: .net vb.net syntax

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)查看评论(见附图)。单词“custom”,“string”和“error”会突出显示,但它们在注释中,因此应该是绿色,而不是蓝色。

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

编辑:

Microsoft Connect中声明为“bug”(即使不是语法“miss”)......

编辑2:

正如Hans Passant所说,像"cucu".Trim()这样的标准字符串方法也不起作用。

2 个答案:

答案 0 :(得分:9)

我可以确认这确实是一个“bug”(在Visual Studio 2008中测试过)。但实际上,它是用VB设计的,不会改变。

但是,我想花时间解释为什么这是一个可怕的问题。对不起Serhio。

  1. 它没有列出重现问题所需的所有步骤。
  2. 它不提供完整的代码。
  3. 它不会将问题减少到最小(不要在这里使用Infer - 它会减少问题)
  4. 因此,完全解释此行为有一百种不同的原因,没有错误(例如,请参阅stakx'优秀(现已删除)答案)。
  5. 这是一个完整的示例,使用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()
    

答案 1 :(得分:2)

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