繁体   English   中英

C#扩展方法重载导致“缺少程序集引用”错误

[英]C# extension method overloading causes “missing assembly reference” error

有一个相应的VS开发票https://connect.microsoft.com/VisualStudio/feedback/details/817276/error-cs0012-the-type-is-defined-in-an-assembly-that-is-not-referenced -issued换的延伸法-即-是-未使用

我有2种扩展方法:

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

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

HttpRequestMessage位于System.Net.Http程序集中, HttpRequestBase位于System.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, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

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

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

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

从C#5.0规范,第7.5.3节:

给定一组适用的候选函数成员,找到该集合中的最佳函数成员。 如果集合只包含一个函数成员,那么该函数成员是最好的函数成员。 否则,最佳函数成员是一个函数成员,它比给定参数列表中的所有其他函数成员更好,前提是使用§7.5.3.2中的规则将每个函数成员与所有其他函数成员进行比较。

第7.5.3.2节:

给定一个参数列表A,其中包含一组参数表达式{E 1 ,E 2 ,...,E N }和两个适用的函数成员M P和M Q ,参数类型为{P 1 ,P 2 ,...,P 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部分,这让你成功了:

如果集合只包含一个函数成员,那么该函数成员是最好的函数成员

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM