我有两个扩展方法:
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的项目中。
该项目编译良好,没有问题。
然后我从另一个项目(比如ProjectB)中使用第一个方法GetClientIpAddress(this HttpRequestBase request)
,用法如下:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var sessionContext = DependencyResolver.Current.GetService<ISessionContext>();
// Call to GetClientIpAddress
sessionContext.ClientIpAddress =
filterContext.HttpContext.Request.GetClientIpAddress();
}
该项目B已经引用了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),这导致缺少对程序集的引用。这是一个bug吗?
当我重命名第一个方法(即摆脱重载)时,一切都可以成功编译。
GetClientIpAddress
。现在需要确定您打算调用哪个方法。它找到了两个候选方法。现在需要确定应该调用其中哪一个。为了做到这一点,它需要理解两个方法的所有参数类型,以确定最佳的方法,或者如果调用存在歧义等。如果它不能理解第二个方法的参数类型,就无法做到这一点。 - Damien_The_Unbeliever