命名和可选参数适用于.NET 2.0

时间:2013-05-10 10:29:28

标签: c# visual-studio-2010

我在Visual Studio 2010中创建了一个控制台项目,并选择了.Net Framework 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带有命名和可选参数吗?

3 个答案:

答案 0 :(得分:7)

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

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

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

如果你自己实现Linq方法,你甚至可以在.Net 2.0和VS 2010中使用Linq(lamda语法)(参见Linq Bridge项目 - 这篇文章也有一个更深入的讨论,如何全部作品)。

答案 1 :(得分:3)

DaveShaw解释了命名/可选参数。你还提到(评论)逆变和协方差 - 它们是不同的:协方差和逆变需要两个编译器更改库更改 - IEnumerable<T>成为IEnumerable<out T>等等。这就是为什么即使使用新的编译器它们也不适用于较旧的.NET版本。

基本上是这样的:

  • 如果您想要的功能完全在编译器中实现,只要您使用较新的编译器,它就可能适用于较旧的.NET版本
  • 如果您想要的功能需要更改BCL,它可能只适用于以后的.NET版本
    • 除非该功能实际上可以完全由其他库实现 - 特别是通过扩展方法。例如,LINQ-to-Objects可以通过添加LINQBridge在较旧的.NET版本(使用较新的C#版本)上运行;同样,Microsoft.Bcl.Async为4.5之前的框架添加了类型,允许使用async / await

答案 2 :(得分:1)

我认为你混淆了.NET版本和C#版本。如果使用Visual Studio 2010进行编译,则使用的是C#4编译器。这与您引用的.NET框架的版本无关。

您正在使用的功能与编译器版本而非框架版本相关联,因此您的代码无法在VS2008中编译(并且无论如何都将在VS2010中成功目标框架版本。)