要求包含引用以支持接口

本文关键字:支持 接口 引用 包含 | 更新日期: 2023-09-27 18:36:44

假设我有一个定义接口的库:

namespace LibraryOne
{
   public interface ISomething
   {
       void DoSomething();
   }
}

我在第二个库中实现了这一点

namespace LibraryTwo
{
   public class Something : ISomething
   {
       public void DoSomething() { throw new Exception("I don't know how to do anything!"); }
   }
}

然后,我在第三个库中使用此类

namespace LibraryThree
{
   public class MyClass
   {
      private Something myThing = new Something();
      public void DoIt() { 
          myThing.DoSomething();
      }
   }
}

Visual Studio告诉我,LibraryThree必须引用LibraryOne才能使此代码正常工作。 即使我做了ISomething internal,做了LibraryOne InternalsVisibleTo LibraryTwo,我仍然必须有那个参考。 为什么?

如果我真的提到一个ISomething,我会理解的。 如果我希望Something表现得像个ISomething,我会理解的。 但我只需要把它当作一个Something.

要求包含引用以支持接口

我只需要把它当作一个Something

事情就是这样:当你在Something中实现ISomething的那一刻,它也变成了一种ISomething。类实现接口这一事实是该类性质的组成部分。

没有这个,你将能够继承Something来创建SomethingElse,并且SomethingElse不会实现ISomething。现在考虑这个例子:

public class Something : ISomething
{
    public void DoSomething() { ... }
    // Add this method
    public void ProcessSomething(Something other) {
        ISomething byInterface = other; // This is legal
        // Now do something with byInterface
    }
}

您的假设代码执行以下操作:

public class SomethingElse : Something {
   ...
}

现在传递一个SomethingElse实例ProcessSomething来完成循环:你的SomethingElse是一个Something但它不是ISomething,打破了C#期望无条件工作的强制转换。

当 CLR 执行应用程序时,它会加载有关程序中引用的类型的所有信息。

因为Something实现了ISomething,所以CLR需要知道接口 - 所以包含这个接口的.dll必须可供可执行文件访问。

每当有一个库调用另一个库时,你的顶级项目中都需要这两个库。您还期望顶级项目在构建过程中如何组装所有必要的文件?