다음을 통해 공유


Visual Studio 2012의 Visual C# 주요 변경 내용

다음 표에서 변경에서 Visual C#에서 Visual Studio 2012 는 수에서 Visual C# Visual Studio 2010에서 컴파일하기에서 만든 응용 프로그램을 방지 하거나 이러한 응용 프로그램의 런타임 동작을 변경.

범주

문제

설명

람다 식

반복 변수를 사용할 수 있습니다는 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 식입니다.

반복 변수를 사용할 수 있습니다는 foreach 문 루프의 본문에 포함 된 LINQ 식에서입니다.

사용은 foreach LINQ 식에 반복 변수를 더 이상 예기치 않은 결과 생성 합니다.다음 예제에서는 변수를 사용 하 여 number LINQ 쿼리에서.

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

명명 된 인수

명명 된 인수와 위치 인수가에 대 한 메서드 호출에서 결과가 이제 오른쪽으로 왼쪽에서 발생할 인수 목록에서.

부작용에서 메서드 호출에 결합 된 명명 된 인수와 위치 인수가 이제 생산 왼쪽에서 오른쪽으로 호출 문의 인수 목록입니다.다음 예제에서 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
}

오버 로드 확인

오버 로드 확인이 사용 하는 호출에 대해 향상 된 명명 된 인수 를 포함 하는 액세스 방법에 params 매개 변수.

해상도 둘 이상의 후보가 발견 되 면 가장 구체적인 형식을 일치 명명 된 인수에 대 한 오버 로드 확인을 선호 합니다.인수에 대 한 필수 또는 호출에 제공 되지 않은 매개 변수는 일치 하는 형식을 오버 로드 후보에 동등 하 게 좋은 경우에 간주 됩니다.

다음 예제에서 string 보다 나은 형식인 object 에 대 한 p2.버전에 따라서 ExampleMethod 매개 변수에서 p2 문자열을 선택 하면 세 번째 있더라도 정의 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

오버 로드 확인

오버 로드 확인에 대 한 호출 간에 알고리즘 선택 해야 위치 향상에 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 = 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# 시작

때 주요 언어 수정 된 주요 변경?