我在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带有命名和可选参数吗?
答案 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版本。
基本上是这样的:
Microsoft.Bcl.Async
为4.5之前的框架添加了类型,允许使用async
/ await
答案 2 :(得分:1)
我认为你混淆了.NET版本和C#版本。如果使用Visual Studio 2010进行编译,则使用的是C#4编译器。这与您引用的.NET框架的版本无关。
您正在使用的功能与编译器版本而非框架版本相关联,因此您的代码无法在VS2008中编译(并且无论如何都将在VS2010中成功目标框架版本。)