成员访问调用不编译,但静态调用

时间:2016-04-12 14:53:23

标签: c# visual-studio syntax-checking

所以今天我在尝试建立公司解决方案时遇到了一些有趣的问题,我想问你们,你们知道为什么会这样吗?我被告知它可能来自我的机器/视觉工作室,因为其他人没有同样的问题。

所以我们在项目A中有一个方法:

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer)
{
   string queueName = typeNameSerializer.Serialize(messageType);

   return messageType.GetAttribute<GlobalRPCRequest>() != null || AvailabilityZone == null
        ? queueName
        : queueName + "_" + AvailabilityZone;
}

GetAttribute<GlobalRPCRequest>()

中定义了public static class ReflectionHelpers
 public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute;

然后我们有项目B,它有方法:

public static string GetAttribute(this XElement node, string name)
{
   var xa = node.Attribute(name);
   return xa != null ? xa.Value : "";
}

我必须指出,我们在项目B中引用了项目A。 现在发生的事情是,当我尝试构建时,我得到编译错误:

  

错误966“System.Xml.Linq.XElement”类型是在未引用的程序集中定义的。您必须添加对程序集'System.Xml.Linq,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的引用。 D:\ Repositories \ website \ website \ submodules \ core \ src \ A \ Extensions \ Extensions.cs 37 13 A

发生的事情是编译器认为我实际上正在使用项目GetAttribute中的B方法(在我看来!)。为什么会这样?因为当我尝试导航到GetAttribute VS时,我会使用正确的方法(ReflectionHelpers中的方法)。 可能是因为反思? 注意:我通过静态调用方法或在项目A中添加对System.Xml.Linq的引用来修复此问题,但我很好奇VS /语法检查的奇怪行为特征

3 个答案:

答案 0 :(得分:1)

这是一个猜测,但我认为你的功能:

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer)与您的助手方法签名不匹配,因为您尝试返回字符串:

public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute;需要TAttribute返回类型。

也许,您可以尝试修改函数RpcRoutingKeyNamingConvention以返回GlobalRPCRequest并检查编译器是否继续发疯。

答案 1 :(得分:1)

Visual Studio一直都很困惑!我试图在我的VS 2015(.NET 4.6)中重现这个场景,它编译得很好。我没有在项目A中添加对System.Xml.Linq的引用。

我的猜测是它可能是一个缓存问题。你可能想试试这个:

  1. 删除对Project B的引用
  2. 清理,然后重建两种解决方案
  3. 添加引用
  4. 重建并瞧!!好吧..希望
  5. 希望它有所帮助,让我知道:)。

答案 2 :(得分:0)

我想这是在继续:
- B引用了System.Xml.Linq
- B没有问题 - 您在A中引用B - A没有引用System.Xml.Linq
- 似乎消耗了B中定义的功能 - 当您尝试构建项目A时,会产生该错误

我是对的吗?

如果是这样的话,这是完全正常的。因为使用引用(A)的项目必须通过它引用的内容(B)引用引用的内容(System.Xml.Linq)。

这样想:当你尝试将nuget包添加到你的项目中时,如果它有一个依赖项,nuget也会安装它。为什么?因为这种情况。

如果我理解你的答案,这是完全正常的。