2011-08-30 5 views
7

コードはVB.NETで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)コメント(添付写真)をご覧ください。 「カスタム」、「文字列」、「エラー」という言葉が強調表示されていますが、それらはコメントに含まれていますので、青ではなく緑でなければなりません。

これはなぜですか?どのような回避策ですか?

EDIT:Microsoft Connectの "バグ"(構文上の "ミス" ということよりない場合であっても)として宣言

...

EDIT 2:

としてはハンスアンパッサン、標準を述べ"cucu".Trim()のような文字列メソッドも機能しません。

+1

Um、回避策は 'test'のように変数に代入することです。 – BoltClock

+0

@BoltClock))))これはなぜですか? )) – serhio

+1

あなたはどうやってそれがすでにバグだと確信していますか? – BoltClock

答えて

2

あなたは、私は、これは確かに(Visual Studioの2008年にテストした)「バグ」であることを確認することができますCStr("cucu").ShowDialog()

8

を行うことができます。しかし、実際にはVBで設計されており、変更されることはありません。

しかし、私は時間がなぜこれは恐ろしい質問なぜ説明したいと思います。申し訳ありませんSerhio。

  1. 問題を再現するのに必要なすべての手順は記載されていません。
  2. 完全なコードは提供していません。
  3. それは(ここではInferを使用していない - それは問題を損なう)最小限に問題を軽減しない結果として
  4. 完全せずに、この動作を説明するだろう百の異なる理由がありますバグ(例として、stakxの優れた(今削除された)回答を参照してください)。

ここでは、これらの問題(新しい空のコンソールプロジェクトソリューションを作成し、Module1.vbにこのコードを貼り付け)がないこと、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では一貫性があります:論理行の最初のトークンとして値を持つことはできません。

New Form1().ShowDialog() 

再び修正がCallによる発現の接頭辞である:例えば、以下のコードは、(フォームクラスForm1の既存の、適切な、定義所与)コンパイルされない

Call New Form1().ShowDialog() 
+0

あなたの発言を修正しました。私はこれが本当の質問ではないことを知っています。私はちょうどこの "問題"を共有したいと思います。 – serhio

関連する問題