Есть некоторые тонкие ломаные изменения, как и в предыдущих версиях. Проблема в том, что C # 4 вводит новый тип действительного преобразования из-за ковариации / контравариантности. Это означает, что некоторые методы, которые ранее были бы применимы , а не , теперь применимы для конкретного вызова. Вот некоторый код, который действителен как для C # 4, так и для C # 2/3:
using System;
using System.Collections.Generic;
public class Base
{
public void DoSomething(IEnumerable<string> strings)
{
Console.WriteLine("Base");
}
}
public class Derived : Base
{
public void DoSomething(IEnumerable<object> objects)
{
Console.WriteLine("Derived");
}
}
public class Test
{
static void Main()
{
Derived d = new Derived();
d.DoSomething(new List<string>());
}
}
В C # 4 будет напечатано «Derived» - в C # 2 и 3 будет напечатано «Base».
Такая же проблема возникла между C # 1 и 2, где выражения экземпляра делегата допускали неуниверсальную ковариацию и контравариантность.
Любые новые преобразования в значительной степени связаны с возникновением такого рода проблем. Однако, по моему опыту, эти вещи вряд ли могут вызвать проблемы.
Кроме того, C # 4 обрабатывает блокирующие и подобные событиям поля немного по-другому - опять же, это не повлияет на большинство кода, но об этом стоит знать. У Криса Барроуза есть серия статей об изменениях в его блоге.