下表列出了visual C#中的更改可能在可防止应用程序在Visual Studio 2010的visual C#创建从生成或更改这些应用程序的运行时行为的 Visual Studio 2012。
1、Lambda表达式
问题:在循环体包含的lambda表达式中使用 foreach 语句中的迭代变量。
说明:使用在嵌套lambda表达式的一个 foreach 迭代变量不再导致意外的结果。 下面的示例在lambda表达式中使用变量的 word。
static void Main() { var methods = new List<Action>(); foreach (var word in new string[] { "hello", "world" }) { methods.Add(() => Console.Write(word + " ")); } methods[0](); methods[1](); } // Output in Visual Studio 2012: // hello world // Output in Visual Studio 2010: // world world
2、LINQ表达式
问题:在循环体包含的LINQ表达式中使用 foreach 语句中的迭代变量。
说明:使用在LINQ表达式的一个 foreach 迭代变量不再导致意外的结果。 下面的示例在LINQ查询中使用可变 number。
static void Main() { var lines = new List<IEnumerable<string>>(); int[] numbers = { 1, 2, 3 }; char[] letters = { 'a', 'b', 'c' }; foreach (var number in numbers) { var line = from letter in letters select number.ToString() + letter; lines.Add(line); } foreach (var line in lines) { foreach (var entry in line) Console.Write(entry + " "); Console.WriteLine(); } } // Output in Visual Studio 2012: // 1a 1b 1c // 2a 2b 2c // 3a 3b 3c // Output in Visual Studio 2010: // 3a 3b 3c // 3a 3b 3c // 3a 3b 3c
3、命名实参
问题:从名为和位置实参的副作用在方法调用中按正确的顺序现在却。
说明:在方法合并的名称和位置实参的副作用调用按正确的顺序现在生成,是从左到右在调用语句。 使用命名和位置的参数组不同的顺序,在下面的示例中,TestMethod 调用。
class Program { static void Main(string[] args) { TestMethod(WriteLetter("A"), b: WriteLetter("B"), c: WriteLetter("C")); TestMethod(WriteLetter("A"), c: WriteLetter("C"), b: WriteLetter("B")); } static int WriteLetter(string letter) { Console.Write(letter + " "); return 1; } static void TestMethod(int a, int b, int c) { } // Output in Visual Studio 2012: // A B C A C B // Output in Visual Studio 2010: // B C A C B A }
4、重载决策
问题:重载解析改进了对该使用 命名实参 到包含 param 参数的访问方法。
说明:当多查找某个解决方案,候选重载决策喜好命名参数的最具体的类型匹配。 参数在调用不需要也不提供参数的考虑,仅当在重载候选类型匹配的是同样可行时。在下面的示例中,string 比 p2的 object 是一种更好的类型。 因此,参数 p2 定义 ExampleMethod 的版本,则应挑选字符串,因此,即使它还有第三 params 参数。
class Program { static void Main(string[] args) { ExampleMethod(p2: ""); } public static void ExampleMethod(string p1 = null, object p2 = null) { Console.WriteLine("ExampleMethod: p2 is object"); } public static void ExampleMethod(string p2 = null, object p1 = null, params int[] p3) { Console.WriteLine("ExampleMethod: p2 is string"); } } // Output in Visual Studio 2012: // ExampleMethod: p2 is string // Output in Visual Studio 2010: // ExampleMethod: p2 is object
5、重载决策
问题:重载解析改进用于调用算法必须选择在 Func<object> 参数和具有不同的类型参数的 Func 参数之间的位置(即..,string 或 int?) Func<dynamic> 参数的。
说明:在下面的示例中,发送到 CandidateMethod 的调用 Func<dynamic> 参数有两个解析候选对象。 对应的形参在某个候选函数是 Func<object>,因此,在其他的相应参数是 Func<string>。有一个 Func<object> 参数的重载候选应处于选中状态,因为 object 和 dynamic 视为等效的。 因此,标识转换存在不仅在 dynamic 和 object 之间,还可以在构造类型 Func<dynamic> 和 Func<object>之间。
class Program { public static void CandidateMethod(Func<object> fun) { Console.WriteLine("Method that has a Func<object> parameter."); } public static void CandidateMethod(Func<string> fun) { Console.WriteLine("Method that has a Func<string> parameter."); } static void Main(string[] args) { dynamic dyn = "a string"; CandidateMethod(() => { return dyn; }); } } // Output in Visual Studio 2012: // Method that has a Func<object> parameter. // Output in Visual Studio 2010: // Method that has a Func<string> parameter.
转载请注明出处:https://www.onexin.net/visual-c-visual-studio-2012-major-changes/