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个选项中的哪一个是分钟并不明显。我希望减号(收集)是明显的。最终没有人会使用无保留的方法。