WEB开发网
开发学院软件开发C语言 C#编译器对泛型方法调用作类型推断的奇怪问题 阅读

C#编译器对泛型方法调用作类型推断的奇怪问题

 2010-09-30 20:50:06 来源:WEB开发网   
核心提示: 它要求指定It.IsAny方法的泛型参数,事实上,C#编译器对泛型方法调用作类型推断的奇怪问题(2),光指定这个也不够,它继续要求Setup方法的泛型参数,内容本身很简单,但是使用时却出现了问题:varvalues=newRouteValueDictionary();values.RemoveK

它要求指定It.IsAny方法的泛型参数。事实上,光指定这个也不够,它继续要求Setup方法的泛型参数。因此,我们必须这么写:

var mockSome = new Mock<ISome>(); 
mockSome.Setup<int>(s => s.Method(It.IsAny<string>())); 
mockSome.Setup(s => s.Method(It.IsAny<string>())); 

现在是int或string可能还没有太多问题,但如果您遇到了IGrouping<string, SortedDictionary<int, DateTime>>这种强大有力的类型,估计您会和我一样欲哭无泪。相信您也遇到过这样的问题。

本以为在大多数情况下不会遇见这样的问题(事实上平时的确用的挺爽),不过我刚才却不小心撞见了另一个古怪的情况,它耗费了我十几分钟的时间,最后在别人的提示下才发现问题所在。原因在于我写的通用扩展方法之一:

public static TDictionary RemoveKeys<TDictionary, TKey, TValue>( 
  this TDictionary source, IEnumerable<TKey> keys) 
  where TDictionary : IDictionary<TKey, TValue> 
{ 
  foreach (var key in keys) 
  { 
    source.Remove(key); 
  } 
 
  return source; 
} 

这个扩展方法的作用是从一个IDictionary对象中移除部分key对应的内容,内容本身很简单,但是使用时却出现了问题:

var values = new RouteValueDictionary(); 
values.RemoveKeys(...); 

RouteValueDictionary是一个实现了IDictionary<string, object>接口的字典对象,因此应该一切正常吧,但是编译器却告诉我出了问题:

Tags:编译器 方法 调用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接