静态扩展方法和Project Roslyn

本文关键字:Project Roslyn 方法 扩展 静态 | 更新日期: 2023-09-27 17:59:11

这里已经注意到(而且非常正确),.NET中的扩展方法只是对实例变量进行静态方法调用的语法糖。

然而,关于这个问题,我想知道为什么在语言规范中省略了静态访问的扩展方法?

作为一名.NET(C#)开发人员,我也是一名JavaScript开发人员,您可以在JavaScript中对等效的静态方法扩展进行建模——因此,我有理由深入研究这一论点(我很清楚.NET和JavaScript是两种截然不同的语言!)

让我们检查一下扩展方法的语法及其编译方式:

public static string Hash(this string value)
{
    // some logic here...
}
string x = "Hello World";
x.Hash();

编译为

public static string Hash(string value)
{
    // some logic here...
}
string x = "Hello World";
Hash(x);

如果您尝试为静态类型创建变量

class MyClass
{
    Console c; // error!
}

你不能!

如果您尝试将静态类型作为方法参数传递

public void DoThis(Console c) // error!
{
}

你不能!

因此,这定义了语言规范的局限性,但就扩展方法而言,我可以看到实现是沿着这些线的。。。

public static void WriteLineInGreen(static Console c, string formatString, params object[] args)
{
    c.ForeGround = ConsoleColor.Green;
    c.WriteLine(formatString, args);
}
Console.WriteLineInGreen("Hello World {0}, {1}, {2}", ":-)", 1234, true);

好吧,这是不可能的。。。为什么我还在问?回答"项目Roslyn";。你认为这是我们可能会看到的东西,以及将在Project Roslyn中实现的所有其他语言规范更改吗?

EDIT任何对Roslyn语言扩展感兴趣的人都应该注意:https://channel9.msdn.com/Events/Build/2014/2-577

静态扩展方法和Project Roslyn

您不能创建静态类型的实例。var c = new Console();不工作。因此,不能有一个具有静态类型的参数。在Console c中,c是什么?您提出的静态类型扩展方法的语法必须是这样的:

public static void WriteLineInGreen(static Console, string formatString,
                                    params object[] args)
{
    Console.ForeGround = ConsoleColor.Green;
    Console.WriteLine(formatString, args);
}

我认为与Roslyn相关的语言规范更改是由于在处理Roslyn时发现了语言规范的不一致和不准确。在我看来,任何新的C#语言特性都与Roslyn有关似乎都不是很合理。

更新:嗯,我在最后一点上错了。正如@svick在评论中指出的那样,新编译器更好的结构使实现语言更改变得更容易。

另一个重要原因是语言和编译器的开发已经成为开源。Microsoft邀请社区参与。(参见:C#7工作特性列表。)