Func(Of TResult)()
という名前の特定のデリゲートFunc
です。System
次のように名前空間内で宣言された型です。
Public Delegate Function Func(Of TResult)() As TResult
別の名前が付けられた可能性があります。例えば:
Public Delegate Function MyParameterLessFunction(Of TResult)() As TResult
これFunc
は、デリゲートに付けられた名前にすぎません。の型がF2
明示的に指定されていないため、VB はこのデリゲートの名前を知りません。Func
それとも何かMyParameterLessFunction
他のものですか?代わりに、 VBはその署名Function() As String
を表示するだけです。F2
Public Delegate Function AnonymousParameterLessStringFunction() As String
コメントでは、.ToString()
onF
とを使用しますF2
。これは実行時の型、つまりこれらの変数に割り当てられた値の型を返します。これらの型は、これらの変数の静的な型、つまり変数名に与えられた型とは異なる場合があります。ちょっとテストしてみましょう
Imports System.Reflection
Module FuncVsFunction
Dim F As Func(Of String) = Function() As String
Return "B"
End Function
Dim F2 = Function() As String
Return "B"
End Function
Sub Test()
Console.WriteLine($"Run-time type of F: {F.ToString()}")
Console.WriteLine($"Run-time type of F2: {F2.ToString()}")
Dim moduleType = GetType(FuncVsFunction)
Dim fields As IEnumerable(Of FieldInfo) = moduleType _
.GetMembers(BindingFlags.NonPublic Or BindingFlags.Static) _
.OfType(Of FieldInfo)
For Each member In fields
Console.WriteLine($"Static type of {member.Name}: {member.FieldType.Name}")
Next
Console.ReadKey()
End Sub
End Module
表示します
Run-time type of F: System.Func`1[System.String]
Run-time type of F2: VB$AnonymousDelegate_0`1[System.String]
Static type of F: System.Func`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Static type of F2: System.Object
F2
と単純に入力されていることに注意してくださいObject
。これは驚きです。私はそれがデリゲート型であることを期待していました。
この違いは、デバッガーでも確認できます。Test
メソッドにブレークポイントを設定し、と のDim
キーワードにカーソルを合わせるF
とF2
、ポップアップが表示されます
'Dim of F (static type)
Delegate Function System.Func(Of Out TResult)() As String
'Dim of F2 (static type)
Class System.Object
変数名にカーソルを合わせると
'F (run-time type)
Method = {System.String _Lambda$__0-0()}
'F2 (run-time type)
<generated method>
F
型情報だけでなく、生成されたメソッド自体の名前も取得します。F2
はオブジェクトであるため、Visual Studio は明らかに のように深く掘り下げませんF
。