为什么C#LINQ表达式必须以Select或Group By Clause结尾,而VB.Net中没有这样的限制

Nik*_*wal 12 c# linq vb.net

由于我的标题是自我解释,我知道如何纠正它,但为什么它首先是这样?

脚本

我写了一个VB.Net代码

Dim list As List(Of String) = New List(Of String)

//Code to populate list

Dim wherelinq As IEnumerable(Of String) = From s In list Where s.StartsWith("A")
Run Code Online (Sandbox Code Playgroud)

这工作正常,没有错误

但是C#中的相同逻辑失败了

List<string> list = new List<string>();

//Code to populate list

IEnumerable<string> wherelinq = from s in list where s.StartsWith("A");
Run Code Online (Sandbox Code Playgroud)

这给出了错误

在此输入图像描述

为什么在C#中有这种限制?我遗失的具体东西是什么?

das*_*ght 5

VB.NET和C#是不同的语言,因此LINQ查询语法自然也是不同的:C#需要select s,而VB.NET则不需要.

Microsoft的文档要求C#中的查询语法查询必须以select或结尾group:

查询表达式必须以from子句开头,并且必须以select或group子句结束.在第一个from子句和最后一个select或group子句之间,它可以包含一个或多个这些可选子句:where,orderby,join,let甚至是from子句.您还可以使用into关键字将join或group子句的结果用作同一查询表达式中其他查询子句的源.

有关语法的详细信息,请参阅C#语言规范,第7.16节.

var wherelinq = from s in list where s.StartsWith("A") select s;
Run Code Online (Sandbox Code Playgroud)

select如果使用函数语法,则不必添加:

var wherelinq = list.Where(s => s.StartsWith("A"));
Run Code Online (Sandbox Code Playgroud)

  • 你没有解释为什么它在C#中是这样的.除非没有其他解释,否则开发人员只是忘了包含它. (6认同)
  • 我已经说过我知道如何纠正它.但为什么会这样呢? (4认同)
  • @NikhilAgrawal - 如果你想要我的猜测,这可以通过检查IL来确认,VB.NET可能正在为你添加Select语句.VB经常添加隐式语言结构,而C#要求开发人员更明确.只有两种不同的语言:不同的开发者都喜欢它 (2认同)