无法在C#中向抽象类添加扩展方法

时间:2013-07-09 11:09:41

标签: 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 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();
            }
        }
    }

1 个答案:

答案 0 :(得分:8)

您正试图像这样调用扩展方法:

Class1.Y();

这不起作用。扩展方法总是在实例上运行,而不是在类本身上运行:

var c = new Class1Impl(); // derived from Class1
c.Y();

换句话说:
扩展方法是一种将实例方法添加到类层次结构而不实际更改现有类的方法 您不能使用它们向类添加静态方法。实际上,C#中没有任何机制允许将静态方法添加到类中,而不是将它们直接添加到类中的传统方法。


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

Class1Extension.Y(c);
相关问题