我有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
。
似乎编译器尝试使用第二种方法GetClientIpAddress(this HttpRequestMessage request)
,这会导致缺少对程序集的引用。这是一个错误吗?
当我重命名第一个方法(即摆脱重载)时,一切都编译良好。
根据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] 删除。
我来说两句