使用在接口中声明和实现的扩展方法

时间:2015-05-08 08:28:07

标签: c# .net oop interface extension-methods

我尝试理解Extension method concept in c#,所以我添加了这个界面:

 public interface IExtension
{
   public static int Multiple(this int a)
   {
       return a * 2;
   }
}

在我的主要方法

 public static void Main()
   {
       Console.WriteLine("Entrer un numero");
       int a =int.Parse( Console.ReadLine());
       a.Multiple();
       Console.ReadKey();
   }

我在a.Multiple();中收到错误表示无法识别该方法。

即使我添加了一个实现接口的静态类,我也会遇到同样的错误。

如何解决此问题?

3 个答案:

答案 0 :(得分:4)

扩展方法必须位于static class,而不是interface

public static class MyExtension
{
    public static int Multiple(this int a)
    {
        return a * 2;
    }
}

你应该打印结果:

Console.WriteLine(a.Multiple());

请注意,您的扩展方法无法更改a的值(因为int是值类型),它只能返回一个新值!。

添加

进行检查
Console.WriteLine(a.Multiple());
Console.WriteLine(a);

同样好奇,在Java 8中Oracle将默认方法添加到接口:https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html它们有点像C#扩展方法,但它们是在接口内部定义的。实现接口的类型可以覆盖它们,否则它们“继承”这些默认方法。

答案 1 :(得分:3)

此代码不应编译。请先阅读c# - https://msdn.microsoft.com/en-us//library/bb383977.aspx

中的扩展方法

扩展方法应该在公共静态类中声明,接口是多余的。

public static class Extensions
{
   public static int Multiple(this int a)
   {
       return a * 2;
   }
}

public static void Main()
{
    Console.WriteLine("Entrer un numero");
    int a = int.Parse(Console.ReadLine());
    int doubledNumber = a.Multiple();
    Console.ReadKey();
}

以下是演示 - https://dotnetfiddle.net/JPJD5g

答案 2 :(得分:2)

必须在非通用static类中指定扩展方法,作为static方法。你不能在界面中声明一个。

编辑:

@LamloumiAfif必须拥有一个与我不同且更神奇的编译器。

Compilation errors