【发布时间】:2016-12-23 09:59:18
【问题描述】:
背景:
我有一个静态类,但静态方法不是扩展方法。我决定将这些方法重构为扩展方法,并且不希望任何代码中断,因为扩展方法可以像静态方法一样被调用。但是,当静态导入用于包含扩展方法的静态类时,代码确实会中断。
示例:
我有一个带有扩展方法和静态方法的静态类:
namespace UsingStaticExtensionTest.Extensions
{
static class ExtensionClass
{
internal static void Test1(this Program pg)
{
System.Console.WriteLine("OK");
}
internal static void Test2(Program pg)
{
System.Console.WriteLine("OK");
}
}
}
当我使用以下 using 指令时,测试程序中的一切正常:
using UsingStaticExtensionTest.Extensions;
namespace UsingStaticExtensionTest
{
class Program
{
static void Main(string[] args)
{
var p = new Program();
ExtensionClass.Test1(p); // OK
p.Test1(); // OK
ExtensionClass.Test2(p); // OK
}
}
}
但是当我使用静态导入 using 指令仅识别具有扩展方法的类时,我无法将扩展方法调用为静态方法:
using static UsingStaticExtensionTest.Extensions.ExtensionClass;
class Program
{
static void Main(string[] args)
{
var p = new Program();
//Test1(p); // Error: The name Test1 does not exist in the current context
p.Test1(); // OK
Test2(p); // OK **I can still call the static method**
}
}
}
问题: 使用静态导入时,为什么不能将扩展方法调用为静态方法?
【问题讨论】:
-
可能是这里的语法处理的一个怪癖,扩展方法的语法需要一个表达式来调用扩展方法。换句话说,在一个类中你不能简单地做
ExtensionMethod();;并暗示this.。看起来扩展方法的这种语法强制胜过静态导入。
标签: c# static extension-methods using