nel*_*eus 4 c# extension-methods c#-5.0
我有2种扩展方法:
public static class ExtensionMethods
{
public static string GetClientIpAddress(this HttpRequestBase request)
{
// ...
}
public static string GetClientIpAddress(this HttpRequestMessage request)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
类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();
}
Run Code Online (Sandbox Code Playgroud)
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节:
给定一个参数列表A,其中包含一组参数表达式{E 1,E 2,...,E N }和两个适用的函数成员M P和M Q,参数类型为{P 1,P 2,...,P ñ }和{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部分,这让你成功了:
如果集合只包含一个函数成员,那么该函数成员是最好的函数成员
| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |