dotnet/roslyn

VB editor doesn't highlight syntax errors in lambdas

Open

#42,857 opened on Mar 27, 2020

 (10 comments) (0 reactions) (0 assignees)C# (4,257 forks)batch import
Area-CompilersConcept-Diagnostic Clarityhelp wanted

Repository metrics

Stars
 (20,414 stars)
PR merge metrics
 (Avg merge 6d 17h) (256 merged PRs in 30d)

Description

In this code:

Module Program
    Sub Main(args As String())
        Foo(Function() 3,
                Sub(x)
                    Dim x = Function(x) x + 3
                End Sub
        )
    End Sub

    Sub Foo(a As Integer, b As Integer)
             ' Do something
    End Sub

    Sub Foo(a As Func(Of Integer), b As Action(Of Integer))
             ' Do something
    End Sub
End Module

The editor puts a red line under Foo in the third line Foo(Function() 3, saying there is an overload resolution error (which is not true), and doesn't highlight the real errors involving declaring a local variable x and a param x inside the Sub(x) lambda sub that has a param x. These errors are reported in one long message, which may be the reason that the editor can't realize them.

Overload resolution failed because no accessible 'Foo' can be called with these arguments: 'Public Sub Foo(a As Integer, b As Integer)': Lambda expression cannot be converted to 'Integer' because 'Integer' is not a delegate type. 'Public Sub Foo(a As Integer, b As Integer)': Lambda expression cannot be converted to 'Integer' because 'Integer' is not a delegate type. 'Public Sub Foo(a As Func(Of Integer), b As Action(Of Integer))': Lambda parameter 'x' hides a variable in an enclosing block, a previously defined range variable, or an implicitly declared variable in a query expression. 'Public Sub Foo(a As Func(Of Integer), b As Action(Of Integer))': Variable 'x' is already declared as a parameter of this or an enclosing lambda expression. 'Public Sub Foo(a As Func(Of Integer), b As Action(Of Integer))': Variable declaration without an 'As' clause; type of Object assumed. 'Public Sub Foo(a As Func(Of Integer), b As Action(Of Integer))': Operands of type Object used for operator '+'; runtime errors could occur.

Contributor guide