4

有相应的 VS 开发票https://connect.microsoft.com/VisualStudio/feedback/details/817276/error-cs0012-the-type-is-defined-in-an-assembly-that-is-not-referenced -为未使用的扩展方法发布

我有 2 种扩展方法:

public static class ExtensionMethods
{
    public static string GetClientIpAddress(this HttpRequestBase request)
    {
        // ...
    }

    public static string GetClientIpAddress(this HttpRequestMessage request)
    {
        // ...
    }
}

HttpRequestMessage位于System.Net.Http程序集中并且HttpRequestBaseSystem.Web(即在不同程序集中)。该类ExtensionMethods位于让我们说ProjectA

该项目编译良好,没有问题。

然后我使用另一个项目的第一种方法GetClientIpAddress(this HttpRequestBase request)(比如说ProjectB),如下所示:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    var sessionContext = DependencyResolver.Current.GetService<ISessionContext>();

    // Call to GetClientIpAddress
    sessionContext.ClientIpAddress =
        filterContext.HttpContext.Request.GetClientIpAddress();
}

ProjectB 已经引用了System.Web,但是当我尝试编译它时,它会导致编译器错误:

类型“ System.Net.Http.HttpRequestMessage”是在未引用的程序集中定义的。您必须添加对程序集“ System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。

我不明白的是为什么我要添加对System.Net.Http.

似乎编译器尝试使用第二种方法GetClientIpAddress(this HttpRequestMessage request),这导致缺少对程序集的引用。这是一个错误吗?

当我重命名第一个方法(即摆脱重载)时,一切都编译得很好。

4

2 回答 2

7

从 C# 5.0 规范,第 7.5.3 节:

给定一组适用的候选函数成员,找到该集合中的最佳函数成员。如果该集合仅包含一个函数成员,则该函数成员是最佳函数成员。否则,最好的函数成员是在给定参数列表方面优于所有其他函数成员的一个函数成员,前提是使用第 7.5.3.2 节中的规则将每个函数成员与所有其他函数成员进行比较。

第 7.5.3.2 节:

给定一个带有一组参数表达式 { E 1 , E 2 , ..., E N } 的参数列表 A 和两个具有参数类型 { P 1 , P 2 , ..., P的适用函数成员 M P和 M Q N } 和 { Q 1 , Q 2 , ..., Q N }, M P被定义为比 M Q更好的函数成员,如果

• 对于每个参数,从 E X到 Q X的隐式转换并不比从 E X到 P X的隐式转换好,并且

• 对于至少一个参数,从 E X到 P X的转换优于从 E X到 Q X的转换。

没有规则“如果参数类型与参数类型完全匹配,则选择那个” - 因此编译器需要有关所有参数类型的完整类型信息才能评估上述规则。

为了解决问题而不必添加对System.Net.Http? 您已经找到了答案 - 使用不同的方法名称。由于之前引用的 7.5.3 部分,这让您成功:

如果集合仅包含一个函数成员,则该函数成员是最佳函数成员

于 2013-07-09T13:03:28.280 回答
0

我也做了一个没有扩展方法的简单测试,得到了同样的效果。正如 Damien_The_Unbeliever 所说,这个问题仅与方法重载有关。

于 2013-07-09T16:00:02.427 回答