C# 为什么可以';当使用静态导入时,我是否将扩展方法作为静态方法调用?
背景:C# 为什么可以';当使用静态导入时,我是否将扩展方法作为静态方法调用?,c#,static,extension-methods,using,C#,Static,Extension Methods,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 c
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**
}
}
}
我有一个静态类,但是静态方法不是扩展方法。我决定将这些方法重构为扩展方法,并且不希望任何代码中断,因为扩展方法可以像静态方法一样调用。然而,当静态导入用于包含扩展方法的静态类时,代码确实中断了
示例:
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**
}
}
}
我有一个带有扩展方法和静态方法的静态类:
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
}
}
}
但是,当我使用static import-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()代码>;并暗示这一点。
。看起来扩展方法的这种语法强制优于静态导入。回答不错。有人知道原因吗?这在原则上似乎是违反直觉的,但我可能遗漏了一些东西。@IsaaClopis不为非限定引用导入它们可能是有区别的(对于扩展[静态]方法),但这可能更违反直觉,因为可能会失去给定的意义。像空减法(这个集合,集合)
。若合格的话,在收集的过程中,2个选项中的哪一个是分钟并不明显。我希望减号(收集)是明显的。最终没有人会使用无保留的方法。