在我上个月工作的项目中,我遇到了奇怪的问题。在解决方案中,我有三个项目项目C ,项目B ,它指的是C和项目A ,它指的是B.在项目中BI写了一个帮手静态类,包含几个通用的静态方法。看起来像这样:
public static class Foo
{
public static void DoStuff(T param) where T : ClassFromAssemblyC // It's ofcs some typical class which is defined in assemblyC
public static int SomeOrdinaryNonGenericMethod()
{
return 0;
}
}
然后,当我尝试构建解决方案时,我在项目A中收到错误消息“错误3类型'ClassFromAssemblyC'在未引用的程序集中定义。您必须添加对程序集'projectC,Version的引用= 1.0.0.0,Culture = neutral,PublicKeyToken = null'。“
我能够在测试项目中重现这个问题并进行一次更改,我必须在项目A中使用 包含泛型方法的类的非泛型方法(参考我使用的SomeOrdinaryNonGenericMethod()示例。当我将方法DoStuff的定义更改为看起来像 public static void DoStuff(ClassFromAssemblyC param) 一切都在正常建设。此外,当我更改访问修改器公共到私人一切正常。一般来说,我有两个问题:
为什么通用静态方法即使不使用也会破坏构建
当泛型方法强制项目A引用项目C时,即使没有使用包含该方法的任何成员或类方法,也可能存在另一种情况。
更新
我找到了类似问题的描述:
Mixing generic methods and extension methods
总结一下,我觉得这个问题的好答案来自这个主题:https://connect.microsoft.com/VisualStudio/feedback/details/668498/problem-with-extension-method-in-c-compiler
通常,C#编译器不会声明引用库所需的内容少于该库自己的引用的传递闭包。在实践中,编译器将尝试仅加载绑定所需的元数据,并且通常可以使用更小的子集,但是没有保证。在这些情况下的解决方案是添加指示的缺失参考。
答案 0 :(得分:0)
如果您使用该方法并不重要。如果公共方法以某种方式使用未引用的类型。 (据我所知)有两种可能发生这种情况的情况: