2013-05-10 39 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會成功)。