Синтаксис VB.NET и методы расширения строк - PullRequest
7 голосов
/ 30 августа 2011

код в 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) Посмотрите на КОММЕНТАРИИ (на прилагаемом рисунке). Слова «пользовательский», «строка» и «ошибка» выделены, однако они есть в комментариях, поэтому должны быть зелеными, а не синими.

Почему это? Какой обходной путь?

РЕДАКТИРОВАТЬ:

Объявлено как «ошибка» в Microsoft Connect (даже если это не более чем синтаксическая «ошибка») ...

РЕДАКТИРОВАТЬ 2:

Как заметил Ганс Пассант, стандартные строковые методы, такие как "cucu".Trim(), также не работают.

Ответы [ 2 ]

9 голосов
/ 30 августа 2011

Я могу подтвердить, что это действительно «ошибка» (протестировано в Visual Studio 2008). Но на самом деле это дизайн VB, и он не изменится.

Однако я хотел бы потратить время на объяснение, почему это ужасный вопрос . Извините, Серхио.

  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()
2 голосов
/ 30 августа 2011

Вы можете сделать CStr("cucu").ShowDialog()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...