【问题标题】:Using an extension method declared and implemented in interface使用在接口中声明和实现的扩展方法
【发布时间】:2015-07-19 02:21:16
【问题描述】:

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

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

在我的 Main 方法中

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

我在a.Multiple(); 中得到一个错误,表示该方法未被识别。

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

我该如何解决这个问题?

【问题讨论】:

  • 据我所知interface 中的static 成员没有任何意义,你有实现吗??
  • 你不能在接口上实现 any 方法。根据定义,接口包含 no 实现。你还有别的意思吗?
  • @pana 有趣的是,在 Java 8 中,他们向接口添加了“默认”方法......所以这在 C# 和 .NET 中是正确的,但这并不是绝对的事实(考虑到 C# 有多少相似和 Java 是)
  • 考虑到方法是在 interface 中实现的,我猜 OP 来自 Java 背景。没有苛刻的感情让我们摆弄dotnetfiddle.net/FidKGT

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


【解决方案1】:

扩展方法必须在非泛型static 类中指定为static 方法。您不能在接口中声明一个。

编辑:

@LamloumiAfif 肯定有一个比我更神奇的编译器。

【讨论】:

  • 不,你可以在接口中实现,你可以测试我的代码看看这个
  • @LamloumiAfif 我已经测试了您的代码,请参阅上面的编辑。
  • 所以我弄错了,我编译前没有错误,编辑器没有提示任何错误!!
【解决方案2】:

扩展方法必须在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);

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

【讨论】:

【解决方案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

【讨论】:

  • 扩展必须在静态类中声明。静态类不能按定义实现接口。所以你不能为这个类声明接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多