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行目と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()
これは私にはコンパイラのバグのように見えます。括弧は明確にメソッド呼び出しにする必要があります。事実としてこれを述べるのは難しいですが、多くのことを意味するために、parensはvb.netでひどく過負荷になっています。明らかに、コンパイラーを混乱させるのはタプルであり、それがなくても正常に動作します。これは今週のStackExchangeポッドキャストでEricLippertと一緒に出てきました。それを聞いて、意味のあることの洗濯物リストを入手することをお勧めします。
これをconnect.microsoft.comに投稿して、言語設計者の意見を聞くことができます。動作は確かにそれをバグと呼ぶほど直感的ではありません。あなたが見つけた回避策は良いです。どちらもまったく同じコードを生成し、オーバーヘッドを追加しません。これは、アセンブリでildasm.exeを実行することで確認できます。
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行目と同等のを使用できます。推測では、プロパティへのアクセスは関数の呼び出しよりも強力です(これらが正しい用語である場合)。