C#编译器对泛型方法调用作类型推断的奇怪问题
2010-09-30 20:50:06 来源:WEB开发网泛型是.NET平台上重要的功能,泛型即为一个“不确定”的类型。C# 3.0中加强了对于类型推断的力度。如果缺少了类型推断,那么C#中的大部分功能,如泛型方法的调用,Lambda表达式都会丧失大部分的可用性——因为过于复杂,所以没有人会去用(还记得这里的Java代码吗?)。
“类型推断”的功能便是希望编译器可以自动从上下文中“意识到”某个泛型参数的具体类型,而不用代码具体指明。但是有些时候我们会发现,C#的代码推断作的相当不完整。例如,我们准备了这样的代码:
public interface ISome
{
int Method(string arg);
}
public class Mock<T>
{
public void Setup<TResult>(Func<T, TResult> func) { }
}
public static class It
{
public static T IsAny<T>() { return default(T); }
}
熟悉Moq框架的朋友一定发现,这段代码和Moq的准备代码有些接近(当然,这里是委托,而Moq则用了表达式树)。于是我们往往希望写这样的代码:
var mockSome = new Mock<ISome>();
mockSome.Setup(s => s.Method(It.IsAny()));
由于ISome接口的Method方法签名已经完全确定了,因此编译器完全可以推断出Setup方法和IsAny方法的泛型参数如何。但是如果你这么做的话,C#编译器会给出这样的错误信息:
The type arguments for method 'It.IsAny<T>()' cannot be inferred from the usage. Try specifying the type arguments explicitly.
更多精彩
赞助商链接