C # 4.0 обратно совместим с C # 2.0? - PullRequest
8 голосов
/ 16 мая 2010

Могу ли я узнать, в чем разница между C # 4.0 и C # 2.0? Совместима ли C # 4.0 с C # 2.0?

Могу ли я сказать, что C # 4.0 - это расширенный набор C # 2.0 (так же, как C ++ для C)?

Спасибо.

Ответы [ 6 ]

12 голосов
/ 16 мая 2010

C # 4.0 почти обратно совместим с предыдущими версиями, но есть несколько критических изменений . Для большинства обычных кодов вы не заметите этих критических изменений.

Для новых функций в C # 4 вы можете проверить статью Википедии , которая имеет довольно хорошее резюме с примерами. Ключевые моменты:

  • Динамический поиск членов
  • Ковариантные и контравариантные параметры универсального типа
  • Необязательное ключевое слово ref при использовании COM
  • Необязательные параметры и именованные аргументы
  • Индексированные свойства

Также помните, что между ними была другая версия - C # 3.0. Одним из наиболее важных дополнений здесь является LINQ и все функции, добавленные, чтобы сделать это возможным. Разница между C # 2.0 и 3.0 намного больше, чем разница между C # 3.0 и 4.0.


Кстати, не весь действительный код C является допустимым C ++, как вы подразумевали в своем вопросе. Смотрите здесь :

В строгом математическом смысле C не является подмножеством C ++. Существуют программы, которые являются допустимым C, но не допустимым C ++, и даже несколько способов написания кода, имеющего различное значение в C и C ++.

7 голосов
/ 16 мая 2010

Есть некоторые тонкие ломаные изменения, как и в предыдущих версиях. Проблема в том, что 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 обрабатывает блокирующие и подобные событиям поля немного по-другому - опять же, это не повлияет на большинство кода, но об этом стоит знать. У Криса Барроуза есть серия статей об изменениях в его блоге.

0 голосов
/ 16 мая 2010

В C # 2.0 добавлено много новых функций:

, поэтому, пожалуйста, просмотрите вышеупомянутые ссылки, чтобы узнать о новых функциях ..

0 голосов
/ 16 мая 2010

Слово предостережения, хотя - остерегайтесь мыслей, которые устаревают - например, OracleClient в ADO.Net ...

Martin

РЕДАКТИРОВАТЬ - Да, у Саймона есть смысл ... Я действительно говорю о .Net. К сожалению ...

0 голосов
/ 16 мая 2010

ДА,

Все функции C # 2.0 все еще в C # 4.0, ОДНАКО, есть новые функции в версии 4, которые явно не в версии 2.

Все, что вы написали в C # 2.0, будет работать в C # 4.0.

Но, очевидно, обратное не сработает .....

0 голосов
/ 16 мая 2010

Да, раньше это делали так.

Что нового в C # 4.0

...