命名参数和可选参数可以在.net 2.0中使用

本文关键字:参数 net | 更新日期: 2023-09-27 18:13:03

我在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();
    }
  }
}

It works successfully.

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

有谁能帮我解决这个问题,因为c# 4自带命名和可选参数

命名参数和可选参数可以在.net 2.0中使用

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

你的VS2010使用c# 4.0编译器,VS2008使用c# 3.0。

这意味着您可以使用语言的新特性来对抗旧的运行时库。

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

DaveShaw已经解释了命名/可选参数。你还提到了(注释)逆变和协方差——它们是不同的:协方差和逆变都需要编译器更改库更改——IEnumerable<T>变成IEnumerable<out T>,等等。这就是为什么它们不能在旧的。net版本上工作,即使有新的编译器。

基本上:

  • 如果你想要的功能完全在编译器中实现,它可能会在旧的。net版本中工作,只要你使用一个新的编译器
  • 如果你想要的特性需要更改BCL,它可能只在以后的。net版本上工作
    • ,除非该特性实际上可以完全由附加的库实现——特别是通过扩展方法。例如,通过添加LINQBridge, LINQ-to-Objects可以在较旧的。net版本(以及较新的c#版本)上工作;类似地,Microsoft.Bcl.Async为一些4.5之前的框架添加了类型,允许使用async/await

我想你混淆了。net版本和c#版本。如果你使用Visual Studio 2010编译,你就是在使用c# 4编译器。这与你引用的。net框架的版本无关。

你使用的功能是绑定到编译器版本,而不是框架版本,所以你的代码在VS2008中编译失败(无论目标框架版本如何,都将在VS2010中成功)。