这里已经注意到(而且非常正确),.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