C#和.NET有多独立?

Sma*_*ery 5 .net c# frameworks programming-languages

我看到语言功能,如C#的foreach循环(需要使用IEnumerable),以及它的using语法(使用IDisposable,知道调用哪个方法)和LINQ(我假设它也使用了一堆.NET东西).所有这些似乎都与.NET框架紧密相关.所以:

  • C#可以存在不同的框架吗?(它已经?)
  • 如果是这样,语言如何指定"foreach循环需要IEnumerable实例"而不将其绑定到框架中.

Ani*_*Ani 6

调查此问题的最佳位置是C#语言规范.例如,在枚举的情况下,这里有一些来自规范的片段:

10.14.2可枚举的接口

可枚举接口是非通用接口System.Collections.IEnumerable以及通用接口System.Collections.Generic.IEnumerable的所有实例.为简洁起见,在本章中,这些接口分别被引用为IEnumerable和IEnumerable.

...

10.14.5.1 GetEnumerator方法

可枚举对象提供IEnumerable和IEnumerable接口的GetEnumerator方法的实现.两个GetEnumerator方法共享一个通用实现,该实现获取并返回可用的枚举器对象.初始化枚举器对象时,在初始化可枚举对象时保存参数值和实例值,否则枚举器对象的功能如第10.14.4节中所述.

这与.NET BCL 中实际定义这些接口的方式很好地结合,尽管不同(即非.NET)框架完全可以提供C#编译器随后可以定位的类似的兼容实现.

难以与.NET框架分离的规范部分通常标记为:

注意:本节仅适用于C#的Microsoft .NET实现.

另一方面,foreach实际上并不需要IEnumerable ; 它可以使用一种"鸭子打字",您可以在规范的第8.8.4节中阅读.