C#编译器对泛型方法调用作类型推断的奇怪问题
2010-09-30 20:50:06 来源:WEB开发网它要求指定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>接口的字典对象,因此应该一切正常吧,但是编译器却告诉我出了问题:
更多精彩
赞助商链接