c# - IClass 不包含 method_name 的定义,也没有扩展方法 method_name

标签 c# interface solid-principles

我不确定为什么我对这段代码有以下错误:

“IClass 不包含 method_name 的定义,也没有扩展方法“method_name”接受第一类型 IClass 的参数(您是否缺少 ref/assembly)”

interface IClass
{
   void Calculate();
}

class A : IClass
{
  public A()
  {
  }

  public void Calculate()
  {
    ...
  }

  public void method_name()
  {
    ... 
  }    
}

class MainClass
{
    public static void Main(string[] args)
    {
        IClass cal;
        cal = new A();
        A.method_name();
    }
}

错误在A.method_name();我得到的错误是“IClass”不包含“method_nam”的定义并且没有扩展方法“method_name”接受第一种类型的参数......

我可以知道为什么会这样吗?我认为如果对象继承接口(interface),我们将能够将对象引用到接口(interface)类型。这是 SOLID 方法的一部分,不是吗?

例如,如果我的界面在同一个文件 (file.cs) 中,我需要添加什么引用。

最佳答案

A.method_name() 将失败并返回 CS0120:

An object reference is required for the non-static field, method, or property 'A.method_name()'

这是因为 method_name() 是一个实例方法,所以它需要知道您打算在哪个对象上调用该方法。 A.method_name() 是调用static 方法的语法(没有this)。


假设(根据您报告的消息)您实际上是指 cal.method_name(),编译器是正确的:method_name 仅在 A 上定义,但您的变量属于 IClass 类型,因此只有 已知属于 IClass 的成员可用。实例 A 的事实无关紧要:您正在为 IClass 契约(Contract)工作;唯一可用的方法是 Calculate(),因为 IClass 宣传了它。如果您想保留对 A 的所有功能的访问权限:不要将局部变量键入为 IClass:

A cal;
cal = new A();
cal.method_name();

var cal = new A();
cal.method_name();

关于c# - IClass 不包含 method_name 的定义,也没有扩展方法 method_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48501598/

相关文章:

tdd - 关于 SOLID/TDD 的问题

c# - 为什么我的匿名方法不能在循环中工作?

Laravel 4 接口(interface)文件错误 : "syntax error, unexpected ' interface' (T_INTERFACE)"

c# - 在 C# 中读取 SQL Server 数据库中的 "real"数据类型

c# - 通用约束如何防止使用隐式实现的接口(interface)对值类型进行装箱?

java - 使用 Java 接口(interface)等 Obj-C 协议(protocol)实现类的可插拔性

c# - 如何为不同的子类实现接口(interface)的多个实例?

c# - 是否有可能在构造函数中违反 Liskov 替换原则?

c# - 用于嵌套层次结构的响应式(Reactive)扩展展开/扫描方法

c# - (http) coreclr/dnxCore 中的 Web 请求提供程序?