0

这里已经注意到(而且非常正确),.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 项目中实现的所有其他语言规范更改中看到的东西吗?

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

4

1 回答 1

1

您不能创建静态类型的实例。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 工作特性列表。)

于 2014-04-19T17:15:58.103 回答