gpt4 book ai didi

c# - 这是 VB.NET 编译器中的错误还是设计错误?

转载 作者:可可西里 更新时间:2023-11-01 03:02:02 26 4
gpt4 key购买 nike

我发现 C# 和 VB 编译器在重载解析方面存在差异。我不确定这是错误还是设计使然:

Public Class Class1
Public Sub ThisBreaks()

' These work '
Foo(Of String)(Function() String.Empty) 'Expression overload '
Foo(String.Empty) 'T overload '

' This breaks '
Foo(Function() String.Empty)
End Sub

Public Sub Foo(Of T)(ByVal value As T)

End Sub

Public Sub Foo(Of T)(ByVal expression As Expression(Of Func(Of T)))

End Sub
End Class

请注意,重载的 Foo 方法是否在 VB 中定义并不重要。唯一重要的是调用站点是在 VB 中。

VB 编译器会报错:

Overload resolution failed because no accessible 'Foo' is most specific for these arguments:

'Public Sub Foo(Of String)(expression As System.Linq.Expressions.Expression(Of System.Func(Of String)))':不是最具体。

'Public Sub Foo(Of )(value As )':不是最具体。


添加用于比较的 C# 代码:

class Class1
{
public void ThisDoesntBreakInCSharp()
{
Foo<string>(() => string.Empty);
Foo(string.Empty);
Foo(() => string.Empty);
}

public void Foo<T>(T value)
{

}

public void Foo<T>(Expression<Func<T>> expression)
{

}
}

最佳答案

暂时忽略“如果 C# 编译器执行它,它一定是正确的,因此它是 VB 编译器中的错误”的假设。我可以立即看到歧义:

Foo(Function() String.Empty)

可以调用 T 版本,用 Func(Of String) 代替 T。或者它可以将单行 lambda 重新分类为表达式树,并调用 Expression(Of Func(Of String)) 方法。没有理由比另一个更受青睐,事实上,VB 会阻止您继续操作,而不是强制您指定所需的一个。

关于c# - 这是 VB.NET 编译器中的错误还是设计错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5620704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com