Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t在C中向抽象类添加扩展方法#_C#_Extension Methods_Abstract Class - Fatal编程技术网

C# Can';t在C中向抽象类添加扩展方法#

C# Can';t在C中向抽象类添加扩展方法#,c#,extension-methods,abstract-class,C#,Extension Methods,Abstract Class,我有一门课: namespace MyNamespace { public abstract class Class1 { public static string X() { return "Greetings from a method."; } } } 以及一种扩展方法: namespace MyNamespace { public static class Class1Extensi

我有一门课:

namespace MyNamespace
{
    public abstract class Class1
    {
        public static string X()
        {
            return "Greetings from a method.";
        }
    }
}
以及一种扩展方法:

namespace MyNamespace
{
    public static class Class1Extension
    {
        public static string Y(this Class1 c1)
        {
            return "Greetings from extension method.";
        }
    }
}
当我尝试访问扩展方法时,编译器会给出以下错误:

'MyNamespace.Class1' does not contain a definition for 'Y'
以下是我如何使用它:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using MyNamespace;

    namespace Test_Console
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Class1.X());
                Console.WriteLine(Class1.Y());
                Console.ReadLine();
            }
        }
    }

您正在尝试如下方式调用扩展方法:

Class1.Y();
那不行。扩展方法始终在实例上操作,而不是在类本身上操作:

var c = new Class1Impl(); // derived from Class1
c.Y();
换句话说:
扩展方法是一种将实例方法添加到类层次结构而不实际更改现有类的方法。
不能使用它们向类中添加静态方法。事实上,C#中没有允许将静态方法添加到类中的机制,而不是简单地将它们直接添加到类中的传统方法


扩展方法实际上只是语法糖。
编译器将上述代码更改为以下内容:

Class1Extension.Y(c);

所以扩展方法不是静态的?从技术上讲,扩展方法是静态类中的静态方法,但它们总是在一个实例上操作-扩展方法的第一个参数具有
this
限定符。不,扩展方法是静态的。