11.10.3 Delegate-Creation Expressions
A delegate-creation expression is used to create a new instance of a delegate type. The argument of a delegate-creation expression must be an expression classified as a method pointer.
One of the methods referenced by the method pointer must exactly match the signature of the delegate type. A method matches the delegate type if the method is not declared MustOverride and if both their signatures and return types match. In the following example, the
A.f variable is initialized with a delegate that refers to the second
Square method because that method exactly matches the signature and return type of
Delegate Function DoubleFunc(x As Double) As Double Class A Private f As New DoubleFunc(AddressOf Square) Overloads Shared Function Square(x As Single) As Single Return x * x End Function Overloads Shared Function Square(x As Double) As Double Return x * x End Function End Class
Had the second
Square method not been present, a compile-time error would have occurred.
The result of the expression is a delegate instance that refers to the matching method with the associated instance expression (if any) from the method pointer expression. If the instance expression is typed as a value type, then the value type is copied onto the system heap because a delegate can only point to a method of an object on the heap. The method and object to which a delegate refers remain constant for the entire lifetime of the delegate. In other words, it is not possible to change the target or object of a delegate after it has been created.
DelegateCreationExpression ::= New TypeName ( Expression )