【问题标题】:Static class methods overloads use cause a compiler error静态类方法重载使用会导致编译器错误
【发布时间】:2019-06-22 09:45:48
【问题描述】:

我在使用静态类方法重载时遇到问题(不确定它是否会在非静态类上重现)

我有 3 个项目。在 ref chan 中,如 project-1 引用 project-2,project-3 引用 project-2。这意味着 project-3 没有直接的 project-1 引用。

在 project-2 上,我有一个静态类,其中包含具有两个重载的方法:一个具有字符串参数,一个具有来自 project-1 的类型。当我尝试使用带有字符串参数的重载从 project-3 调用方法时,编译器会引发一个错误,我必须在项目 3 中引用 project-1。如果我创建一个新方法并执行与带有字符串参数的重载方法相同的操作 -everythig工作正常。我会尽量用代码解释。

项目-1

public class Foo
{
   public string Text { get; set; }
   public string Bar()
   {
      return Text + " bar";
   }
}

Project-2(参考 Project-1)

public static class StaticClass
{
   public static string RunAnother(string str)
   {
      var foo = new Foo { Text = str };
      return Run(foo);
   }

   public static string Run (string str)
   {
      var foo = new Foo { Text = str };
      return Run(foo);
   }

   public static string Run(Foo foo)
   {
      return foo.Bar();
   }
}

Project-3(仅参考 project-2)

var t1 = StaticClass.Run("test"); //Compile error: " The type 'Foo' is defined in an assembly that is not referenced."

var t2 = StaticClass.RunAnother("test"); //Works great

为什么会这样?

【问题讨论】:

  • 您重建了完整的解决方案吗?
  • @FrodeNilsen 是的。它不是运行时错误。这是编译器错误。
  • 尚未构建的东西如何工作? Project-3 示例中的第一行没有使用 Foo 类型。
  • 好的。我会纠正自己:如果我使用 var t1 = StaticClass.Run("test"); - 我有编译器错误。如果我使用 var t2 = StaticClass.RunAnother("test"); - 构建通过,它工作正常。

标签: c# .net


【解决方案1】:

当编译器解析要调用的重载时,它会分析参数类型及其关系。例如。在编译器需要选择正确的重载的以下情况下,您可能会有重载:

public class MyBase { }
public class MyClass : MyBase { }

public class A
{
  public void DoSomething(MyBase b) { }
  public void DoSomething(MyClass c) { }
}

因此,编译器和后来的 .NET 运行时需要了解重载方法中涉及的类型的详细信息。这就是为什么 project-3 需要对 project-1 的引用。顺便说一句,这个问题与静态类无关。

因此,要么将 project-3 的引用添加到 project-1,要么将 Foo 替换为 project-3 和 project-2 知道的类型。您可以使用以下选项:

  • Foo 移动到所有三个项目都引用的另一个项目。
  • 在 project-2 中定义 FooAdapter 并将其用作参数。所以只有 project-2 知道原来的Foo,但 project-3 不知道。

【讨论】:

    【解决方案2】:

    对于参数解析,编译器必须知道每个重载的方法,以及最终没有使用的方法。 例如。也许有一些隐式转换操作应该发挥作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多