Поделиться через


Критические изменения Visual C# в Visual Studio 2012

В следующей таблице перечислены изменения в Visual C# - # в Visual Studio 2012, то может предотвратить приложение, созданное в C 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> содержит 2 кандидата разрешения.Соответствующий параметр в одном из кандидатов 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#

Если не удается прерывание языка прерывает?