C#和#x27;s LINQ和.NET框架,哪一个依赖于另一个?

C#和#x27;s LINQ和.NET框架,哪一个依赖于另一个?,c#,.net,linq,C#,.net,Linq,我认为C语言编译器是一个自包含的黑盒,能够理解特定语法的文本并生成编译代码。另一方面,.NET框架是一个包含C部分和部分由C++编写的功能的大型库。因此.NET框架依赖于C语言,而不是相反 但我无法将此融入LINQ的工作方式。LINQ查询是C#编译器可以理解的特定语法的文本。但要使用自己的LINQ提供程序进行构建,我需要使用像IQueryable和IQueryProvider这样的接口,这两个接口都是在框架的System.LINQ命名空间中定义的 这是否意味着C语言提供的功能依赖于.NET fr

我认为C语言编译器是一个自包含的黑盒,能够理解特定语法的文本并生成编译代码。另一方面,.NET框架是一个包含C部分和部分由C++编写的功能的大型库。因此.NET框架依赖于C语言,而不是相反

但我无法将此融入LINQ的工作方式。LINQ查询是C#编译器可以理解的特定语法的文本。但要使用自己的LINQ提供程序进行构建,我需要使用像IQueryable和IQueryProvider这样的接口,这两个接口都是在框架的System.LINQ命名空间中定义的

这是否意味着C语言提供的功能依赖于.NET framework的一部分?C语言知道.NET框架吗

LINQ查询是C#编译器可以理解的特定语法的文本

好吧,查询表达式是-但是编译器并不真正“理解”它们。它只是以一种相当机械的方式翻译它们。例如,以以下查询为例:

var query = from foo in bar
            where foo.X > 10
            select foo.Y;
这可转化为:

var query = bar.Where(foo => foo.X > 10)
               .Select(foo => foo.Y);
编译器不知道这里的
Where
Select
是什么意思。它们甚至不必是方法——如果您有适当的字段或委托类型的属性,编译器就可以使用它们。基本上,如果第二个表单将被编译,那么查询表达式也将被编译

大多数LINQ提供程序使用扩展方法来提供这些方法(
Where
Select
SelectMany
等)。同样,它们只是C语言的一部分——编译器不知道或不关心扩展方法做什么


有关如何翻译查询表达式的详细信息,请参见。你可能会发现我的Edulink系列的其余部分也很有用——它基本上是一系列的博客文章,在这些文章中,我将LINQ重新实现为对象,一次一个方法。同样,这表明C#编译器不依赖于
System.LINQ
命名空间中的LINQ实现,或者类似的任何东西。

.NET框架包含许多部分。其中最重要的是CLR—公共语言运行库。包括C#在内的所有.NET语言都依赖它,因为它们生成的IL代码无法由机器处理器执行。相反,CLR执行它

还有基类库Bcl,它可以用于每种.NET语言:C++,VB.NET,托管C++,F,iRuRube,你可以说出它。我怀疑它是用C写的。它不依赖于这些语言的任何特性,因为类和OOP是在CLR中构建的

所以,是的,C语言知道.NET框架,它绝对必须知道它。想想
IEnumerable
:要将
foreach
编译成
GetEnumerator()
,并调用
MoveNext()
,C编译器必须知道,
IEnumerable
是存在的。而且有点特别

或者考虑属性!C#编译器对接口提供的方法<代码>属性具有内在知识


但是CLR本身对C#一无所知。完全可以。

LINQ不仅仅是一个框架。该语言通过扩展方法、
yield
、lambda表达式等功能进行了修改。它们都是相互依赖的。我不是说LINQ是一个框架。我试图理解LINQ是如何工作的。如果你想理解它:+1,回答得好。然而,BCL的大部分内容是用C#编写的,但这只是一个实现细节。它可以用任何语言编写,因此C#和.Net Framework相互依赖,并且都依赖于CLR。我必须对C#和.NETFW之间的循环依赖关系做更多的挖掘,但您的答案肯定是有用的+我投赞成票。我不太清楚你所说的“.NET框架”。在我看来,CLR和BCL是框架的一部分,而C#语言不是。NET Framework 3.5的安装没有附带C#compiler.OK,因为“where”和“select”是编译器不知道的扩展方法(IQueryable),编译器如何强制LINQ表达式的语法?是什么使编译器决定它是一个查询表达式?是“from”关键字吗?IQueryable在这张图片中的位置是什么?(我一定会在方便的时候阅读你的博客系列,我相信我会有很多“啊哈!”的时刻。)@e-mre:是的,编译器知道它是一个查询表达式,因为它以“from”开头,并且它不用于以任何其他方式有效的上下文中。(这不是一个关键字-只是一个上下文关键字。您仍然可以有一个名为
from
的变量,但是
from x in y
永远不会作为非查询表达式有效,除非您有一个名为
from
的类型,并且您在
foreach
语句中……)
IQueryable
在翻译后出现-
Select
其中
等被称为扩展方法,即使您没有使用查询表达式开始,它们也会被称为扩展方法。这是否意味着我可以使用扩展方法(如“abc”、“def”)构建自己的IMyQueryable接口,并且我可以编写以“from”但在IMyQueryable中调用方法?类似于“mycol abc myobj.X=10 def myobj中的from myobj”@e-mre:No,必须调用扩展方法
Select
Where
等。从查询表达式到“非查询表达式”的转换“LINQ是硬编码到C语言中的。除了EduLinq之外,还有一个LINQ重新实现的例子。编写它是为了允许编译为目标.NET2.0的程序使用LINQ。