Visual Studio 2012 での Visual C# の互換性に影響する変更点
次の表は、コンパイルから Visual Studio 2010 の Visual C# で作成された回避またはそのようなアプリケーションの実行時の動作をする可能性のあるアプリケーションを変更する Visual Studio 2012 の Visual C# の変更の一覧を示します。
ラムダ式 |
ループの本体に含まれるラムダ式で foreach のステートメントの反復変数を使用できます。 |
入れ子になったラムダ式の foreach の反復変数の使用は、予期しない結果が生成されるとは限りません。次の例は、ラムダ式の可変 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
|
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
|
[named arguments] |
メソッド呼び出しの名前と位置指定引数からの副作用は引数リストで左から右に実行されます。 |
メソッドの呼び出しで位置指定引数と名前付きまとめられるからの副作用は呼び出し元ステートメントの引数リストで左から右に生成されます。次の例では、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
}
|
オーバーロードの解決 |
オーバーロードの解決は パラメーター のパラメーターを含むアクセスする方法に [named arguments] を使用する呼び出しで強化されました。 |
複数の解決の候補がある場合、オーバーロードの解決は名前付き引数の特定の型の一致が選択されます。引数が使用に必要でないため、使用されていないパラメーターはオーバーロード候補の型の一致が等しく適切場合にだけ有効です。
次の例では、string は p2の object より明確な型です。したがって、番目の params のパラメーターがある場合でも、文字列を選択する必要があるパラメーターとして p2 が定義されている ExampleMethod のバージョン。
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
|
オーバーロードの解決 |
オーバーロードの解決は、アルゴリズムで Func<object> のパラメーターと Func<dynamic> の引数に異なる型のパラメーターが (または) stringint?ある Func のパラメーターの中から選択する必要がある呼び出しのようにアップグレードされます。 |
次の例では、送信 CandidateMethod の呼び出しに Func<dynamic> の引数 2 人の解決の候補があります。候補の 1 の対応するパラメーターは Func<object>で、他の対応するパラメーターは Func<string>です。
Func<object> のパラメーターを持つオーバーロード候補は object と dynamic が等価であると見なされるため、を選択する必要があります。したがって、ID の変換は 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 = 15;
CandidateMethod(() => { return dyn; });
}
}
// Output in Visual Studio 2012:
// Method that has a Func<object> parameter.
// Output in Visual Studio 2010 if Microsoft.CSharp is referenced:
// Method that has a Func<string> parameter.
// Output in Visual Studio 2010 if Microsoft.CSharp isn't referenced (for instance, in a Unit Test Project):
// Method that has a Func<object> parameter.
|
参照
関連項目
ラムダ式 (C# プログラミング ガイド)
params (C# リファレンス)
dynamic (C# リファレンス)
概念
名前付き引数と省略可能な引数 (C# プログラミング ガイド)
その他の技術情報
Visual C# について
中断、言語の中断または修正。