【问题标题】:C# Getting Error: Type "Indirect.Class" Not Defined In an Assembly Not Referenced . Must Add a reference to assembly "Indirect"C# 出现错误:在未引用的程序集中键入“Indirect.Class”未定义。必须添加对程序集“间接”的引用
【发布时间】:2016-03-16 21:02:15
【问题描述】:

我意识到这个问题已经提出,但我的原因与我在类似问题上看到的不同,所以这是我的设置。

我有 2 个 c# 项目 AB,项目 B 引用第三方库 IndirectA 将调用B 中定义的静态方法,并且在构建时出现以下错误。

错误 2 类型“Indirect.Class”在未引用的程序集中定义。您必须添加对程序集“Indirect, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”的引用。

代码如下:

//Project A
class A
{
    static void Main(string[] args)
    {
        B.TestMethod("fileName", "param2");
    }
}

//Project B
public class B
{
    public static string TestMethod(string fileName, string param2)
    {
        return "";
    }

    public static bool TestMethod(Indirect.Class doc, string anotherParam)
    {
        return false;
    }
}

所以即使在A 中我调用了不依赖于Indirect 程序集的B 方法,我仍然看到错误。有人可以向我解释为什么编译器在编译时无法确定这一点吗?我可以简单地重命名第二个B.TestMethod,错误就会消失,或者我可以添加第三个参数,但所有这些似乎都没有必要。

【问题讨论】:

  • 您仍然需要添加程序集。编译器可以在编译时访问它需要的内容,但如果在运行时未引用间接程序集,则程序集 B 无法加载,因此程序集 A 也无法加载。

标签: c# .net compiler-errors .net-assembly


【解决方案1】:

编译器必须选择最匹配的重载,在此过程中,它会评估每个候选者所需的转换次数,然后对它们进行排名。

你和我都知道,因为有完全匹配,所以其他人有多糟糕并不重要,因为他们永远不会赢。但这不是语言规则的编写方式,也不是编译器的工作方式。

编译器不知道你没有调用第二个重载,直到它对所有重载进行排序,包括你没有调用的重载。为此,它会检查实际参数(string 类型)是否可以转换为形参类型(Indirect.Class),并且它需要在程序集中查看 Indirect.Class,因为这是转换将被定义。

【讨论】:

  • 就其价值而言,对于处于相同情况的其他任何人,我实际上最终将第二个 TestMethod 切换为 internal 而不是 public,这足以让编译器不考虑它.当然,由于我的解决方案也是内部制作的,因此其他人可能无法接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2019-06-28
  • 2019-10-16
相关资源
最近更新 更多