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

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

 2010-09-30 20:50:06 来源:WEB开发网   
核心提示:泛型是.NET平台上重要的功能,泛型即为一个“不确定”的类型,C#编译器对泛型方法调用作类型推断的奇怪问题,C# 3.0中加强了对于类型推断的力度,如果缺少了类型推断,于是我们往往希望写这样的代码:varmockSome=newMock<ISome>();mockSome.Setup

泛型是.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.

1 2 3  下一页

Tags:编译器 方法 调用

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