2

4行目と5行目の内部に違いはありますか?

VB.netが3行目を処理できないのはなぜですか?

関数を呼び出す適切な方法は何ですか?

Dim aFunc As New Tuple(Of Func(Of String))(Function() "Hello World")
Dim s As String
s = aFunc.Item1() 'does not compile
s = (aFunc.Item1)()
s = aFunc.Item1.Invoke()
4

2 に答える 2

3

これは私にはコンパイラのバグのように見えます。括弧明確にメソッド呼び出しにする必要があります。事実としてこれを述べるのは難しいですが、多くのことを意味するために、parensはvb.netでひどく過負荷になっています。明らかに、コンパイラーを混乱させるのはタプルであり、それがなくても正常に動作します。これは今週のStackExchangeポッドキャストでEricLippertと一緒に出てきました。それを聞いて、意味のあることの洗濯物リストを入手することをお勧めします。

これをconnect.microsoft.comに投稿して、言語設計者の意見を聞くことができます。動作は確かにそれをバグと呼ぶほど直感的ではありません。あなたが見つけた回避策は良いです。どちらもまったく同じコードを生成し、オーバーヘッドを追加しません。これは、アセンブリでildasm.exeを実行することで確認できます。

于 2013-03-21T20:02:53.300 に答える
2

aFunc.Item1は関数であるため、文字列に割り当てることはできません。あなたは望んでいるようです:

Dim aFunc As New Tuple(Of Func(Of String))(Function() "Hello World")
Dim s As String
Dim f As Func(Of String) = aFunc.Item1
s = f.Invoke()

編集: s = aFunc.Item1()プロパティにアクセスしますItem1。そのプロパティが参照する関数を呼び出すには、s = aFunc.Item1()()4行目と同等のを使用できます。推測では、プロパティへのアクセスは関数の呼び出しよりも強力です(これらが正しい用語である場合)。

于 2013-03-21T19:45:18.150 に答える