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

神经元

有相应的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.HttpHttpRequestBase并且位于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

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

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

Damien_The_Unbeliever

根据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 ñ }和{Q 1,Q 2,...,Q ñ }中,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的先前引用的部分:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Unity中设置单元测试并修复缺少的程序集引用错误?

使用C#扩展方法重载运算符

尝试调用有效方法重载时出现奇怪的“未引用程序集”错误

已安装PagedList软件包,控制器中出现“缺少程序集引用”错误

方法重载C#

引用较旧版本的nuget依赖项的C#库导致程序集反射失败

在C#中处理sql xevents,缺少程序集

C#MVC处理视图中的编译错误,例如缺少程序集引用?

C ++函数重载导致seg错误

'List <Choice>'不包含'ChoiceId'的定义,也没有扩展名...您是否缺少using指令或程序集引用?)

C#出导致方法错误没有重载?

C#。引用扩展方法的引用返回委托

C#-重新编译旧代码,遇到错误(您是否缺少程序集引用?)

c#错误1找不到类型或名称空间名称”(是否缺少using指令或程序集引用?)

Linq to SQL扩展方法:方法重载,错误

CS0246:找不到类型或名称空间名称“ T”。您是否缺少using指令或程序集引用?在C#中

您是否缺少using指令或程序集引用?C#错误

找不到CaptureElement,缺少程序集引用

错误提示我缺少using指令或程序集引用,但我没有...。

错误1找不到类型或名称空间名称*(您是否缺少using指令或程序集引用?)

C#函数对重载方法的引用

错误:找不到类型或名称空间名称'SqlCe'(您是否缺少using指令或程序集引用?)

缺少using指令或程序集引用MVC

创建/更新Windows Phone Store应用程序引发错误“您是否缺少程序集引用”

CS0246 C# 找不到类型或命名空间名称“ForeignKeyAttribute”(您是否缺少 using 指令或程序集引用?)

缺少程序集参考错误

更新后缺少程序集引用

C# 获取未引用的程序集

在 PowerShell 中执行 C# 代码会导致错误 - 验证是否加载了包含此类型的程序集