Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以像LINQ那样创建C语言修改?_C#_Linq_Compiler Construction_Language Design - Fatal编程技术网

C# 是否可以像LINQ那样创建C语言修改?

C# 是否可以像LINQ那样创建C语言修改?,c#,linq,compiler-construction,language-design,C#,Linq,Compiler Construction,Language Design,我已经看了不少了 他特别指出,该守则: var list = (from person in people where person.FirstName.StartsWith("J") orderby person.Age select person.LastName) .ToList(); 转换为LINQ库提供的扩展方法: people.Where(person => person.FirstName.StartsWith

我已经看了不少了

他特别指出,该守则:

var list = (from person in people
        where person.FirstName.StartsWith("J")
        orderby person.Age
        select person.LastName)
       .ToList(); 
转换为LINQ库提供的扩展方法:

people.Where(person => person.FirstName.StartsWith("J"))
  .OrderBy(person => person.Age)
  .Select(person => person.LastName) 


我的问题是,一个人如何用一个库给大人物留下足够的印象,使他们允许语言改变以支持库?或者这些词在LINQ出现之前就已经保留了?

我非常怀疑编译器开发人员是否会为任何库实现语法扩展。如果您确实想要语言级集成,可以开发一个预处理器,将自定义语法转换为有效的C#。这基本上就是编译器对LINQ所做的(正如您在问题中指出的)

当然,在Visual Studio中,您可能会丢失自动完成和语法突出显示等功能,但这可以通过扩展来修复。

使用Mono C#编译器-它是开源的,您可以进行任何需要的语言修改和.net支持的修改,例如,使用枚举作为通用约束,创建返回对具有受保护或内部可见性的值类型(
public ref int Max(ref int x,ref int y){if(x>y)返回ref x;else返回ref y;}
)的引用的方法

当然,你正在创建一个不兼容的C#派生词,但是如果你足够努力的话,人们可能会喜欢它


另一种选择:创建一个博客,为它提供一些非常好的用例,可能是一个.net语言的示例实现,或者使用定制的编译器,展示它解决了什么问题,以及为什么这将是一个巨大的胜利,证明了在指定、设计、开发、,测试和记录该功能。

这是可能的,但会很困难,他们可能会重新实现这个想法,以更好地适应他们的语言结构。新的async特性类似于一个名为AsyncEnumerator的库,但它们正在构建一切以更好地适应该语言。LINQ的关键字没有预先保留,但它们是上下文关键字,这意味着可以有标识符在LINQ上下文之外匹配这些关键字。当编译器检测到LINQ构造时,它将进入LINQ模式,其中这些关键字是实际保留字。

某些语言允许扩展其语法和语义。最接近C#的是(它甚至支持C#的一个安全子集,您可以根据自己的喜好进行扩展),但几乎任何Lisp都可以这样做。因此,如果您使用的语言足够强大,您不需要“打动”任何人——任何库都可以为语言本身添加新功能


有传言说下一代C#也将提供一些基本的元编程支持,但我找不到任何细节。

成为Jon Skeet?微软“大人物”喜欢Cookie…你知道LINQ是由微软开发的,也是一家口述C#、.NET和CLR的公司,对吗?我不知道为什么会关闭它。显然,OP无法说服编译器开发人员为其库实现新语法,但这个问题可以通过“编写一个在编译器之前运行的预处理器”轻松回答。有关规范性的“为什么不添加语法”答案,请参阅。您无法通过更改编译器来完成每一项任务。因为它只是将C#转换为CLR,所以您仍然受到CLR规则的限制。您需要修改.NET framework本身和编译器。@Stefan,您可以“伪造”许多CLR不支持的东西。要么自己实现它们(比如C#闭包),要么假装它们确实存在,但不要将它们包含在生成的代码中(比如F#度量单位或Java泛型)。@Stefan:我就是这么说的—“需要修改,并且.net支持修改”。所以,如果你想要像“确定性定稿”这样的东西,你当然是运气不好。但是有很多.net支持的功能C#不支持。@Michael:好的,对不起,我没有注意到这一点。也很有趣。我想我得试试这个。