2013-05-10 58 views
2

我创建了一个控制台项目在Visual Studio 2010与.Net框架2.0选择命名和可选参数的工作在.NET 2.0

namespace ConsoleApp1 
{ 
    class Program 
    { 
    public int Add(int a, int b = 0, int c = 0) 
    { 
     Console.WriteLine("a is " + a); 
     Console.WriteLine("b is " + b); 
     Console.WriteLine("c is " + c); 
     return a + b + c; 
    } 

    public static void Main() 
    { 
     Program o = new Program(); 
     Console.WriteLine(o.Add(10)); 
     Console.WriteLine(o.Add(10, 10)); 
     Console.WriteLine(o.Add(10, 10, 10)); 
     Console.WriteLine(o.Add(b: 20, a: 10)); 
     Console.ReadLine(); 
    } 
    } 
} 

它的工作原理成功。

但是,如果我在Visual Studio 2008中输入相同的代码,它会失败!

任何人都可以请帮我解决这个问题,因为命名参数和可选参数随C#4一起提供?

+0

我不能完全肯定,但它可能只是编译的事情。创建的代码与'.NET 2.0'运行时完全兼容。和VS2008不理解这个构造,因为它不了解最新的'C#'规范(除非你安装额外的软件包) – Pako 2013-05-10 10:31:43

+0

我试图找到确切的原因,因为我试图在泛型接口和委托中使用协变和反变量,它只能工作在.NET 4.0中。其他C#4.0功能在.NET 2.0或.NET 3.5中失败。 – 2013-05-10 10:33:04

+0

@PrakashBhatia我在回答中提到了协变/反变化 – 2013-05-10 10:41:07

回答

3

DaveShaw解释了命名/可选参数。你还别说(评论)逆变和协方差 - 它们是不同的:协变和逆变需要编译器改变库的变化 - IEnumerable<T>成为IEnumerable<out T>等。这就是为什么他们不工作,甚至上与旧版本的.NET新的编译器。

所以基本上:

  • ,如果你想在编译器完全实现的功能,它可能会只要你使用一个新的编译器
  • 如果该功能你想工作在老版本的.NET需要BCL更改,它可能只适用于以后的.NET版本
    • 除非该功能实际上完全可以由附加的库实现 - 特别是通过扩展方法。例如,LINQ到对象可以在较老的.NET版本(使用较新的C#版本)上工作,方法是添加LINQBridge;同样,Microsoft.Bcl.Async增加各类一些前期4.5框架允许async/await使用
7

这是因为命名参数是C#语言的一个功能,而不是.net运行时。

您的VS2010使用C#4.0编译器,VS2008使用C#3.0。

这意味着您可以针对较旧的运行时库使用语言的较新功能。

如果你自己实现了Linq方法(参见Linq Bridge项目 - 这篇文章还有关于它是如何工作的更深入的讨论),你甚至可以在.Net 2.0和VS 2010中使用Linq(lamda语法)。

+0

我也尝试了其他C#4.0功能,当我在VS 2010中选择.NET framework 2.0时,它们失败 – 2013-05-10 10:35:41

+0

哪些功能是那些功能?我每天都在使用C#4对抗.Net 2.0,并据我所知使用所有功能。唯一的限制是依赖.Net框架的(如Linq)。 – DaveShaw 2013-05-10 10:40:24

+0

@PrakashBhatia它将取决于确切的功能;即该功能是否依赖于编译器?框架?或只是方法签名(通常通过扩展方法)? – 2013-05-10 10:40:27

1

我认为你是令人困惑的.NET版本和C#版本。如果使用Visual Studio 2010编译,则使用C#4编译器。这与您所引用的.NET框架的版本无关。

您正在使用的功能是联系在一起的编译版本不框架版本,所以你的代码没有在VS2008编译(且不论目标框架版本在VS2010会成功)。