首页 > 解决方案 > 在 c# 接口中设置属性中的实现细节

问题描述

我是 C# 的新手。我已经浏览了接口并知道接口内部只允许使用属性和方法,因为它们不应该包含任何实现细节。我还知道,即使在 c# 中允许使用属性,它们也不会生成支持字段,不像在班上。困扰我的是 c# 编译器允许我编写这个接口:

  interface IPrinter {
    int printCount { 
      get { 
        return printCount; 
      }
      set { 
        Console.WriteLine("Your text:"); 
      }
    }
  }

我什至可以执行它。有人可以纠正我对为什么 c# 不限制我在接口中的实现的理解吗?

标签: c#

解决方案


您指的是 C#8 中的一个特性:接口的默认实现,现在只是一个草案。使用此功能,您可以在接口本身内实现,而无需实际创建具体类。不过,根据我的理解,这归结为类似于具有接口名称的抽象基类。

截至此功能的规格:

接口可能不包含实例状态。虽然现在允许使用静态字段,但接口中不允许使用实例字段。

在您的情况下,您没有任何state。这printCount是一个属性,而不是一个字段。特别是您的属性没有任何支持字段,它所做的只是调用一个static方法(以及您的 getter 中的无限递归导致StackOverlowException运行时的 a,顺便说一句。)。

因此,除非您没有在接口中引入某种状态(根据规范,这是通过引用实例字段),否则您可以在默认实现中进行任何您想要的操作。


推荐阅读