O C # 6.0 funciona no .NET 4.0?

275

Criei um projeto de amostra, com brindes do C # 6.0 - propagação nula e inicialização de propriedades como exemplo, defina a versão de destino .NET 4.0 e ... funciona.

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

Isso significa que posso usar os recursos do C # 6.0 para o meu software direcionado ao .NET 4.0? Existem limitações ou inconvenientes?

MajesticRa
fonte
7
.Net versões 2.0 - 3.5 usam CLR v2.0. As versões mais recentes usam o CLR v4.0.
I3arnon
ter em mente que, otimizar sábio: você está adicionando um separado se nulo-seleção para cada gato como este
Terence
2
Minha nossa. Estou desenvolvendo um WCF direcionado à v4.6 apenas para ser "lembrado" de que o servidor de produção não deve ser atualizado até 2018. Pensei que o trabalho de um mês exigiria alguns dias de refatoração. Concluído em cinco minutos. Obrigado, Microsoft! : D
Eric Wu

Respostas:

286

Sim (principalmente). O C # 6.0 requer o novo compilador Roslyn, mas o novo compilador pode compilar visando versões de estrutura mais antigas. Isso é limitado apenas a novos recursos que não exigem suporte da estrutura .

Por exemplo, enquanto você pode usar o recurso de interpolação de strings no C # 6.0 com versões anteriores do .Net (como resulta em uma chamada para string.Format):

int i = 3;
string s = $"{i}";

Você precisa do .Net 4.6 para usá-lo, IFormattablepois somente a nova versão do framework adiciona System.FormattableString:

int i = 3;
IFormattable s = $"{i}";

Os casos que você mencionou não precisam de tipos da estrutura para funcionar. Portanto, o compilador é totalmente capaz de oferecer suporte a esses recursos para versões antigas da estrutura.

i3arnon
fonte
31
Na verdade, você não precisa do .Net 4.6, apenas alguns tipos adicionados a ele. Você pode adicioná-los a estruturas mais antigas. Esse código funciona bem no .Net 4.0 e 3.5.
svick
10
Existe uma lista em algum lugar para ver quais recursos do C # 6 funcionam no .NET 4.0? Outra maneira de perguntar isso seria: quais novos recursos requerem suporte da estrutura e quais não?
Rubenisme
1
@ Rubenisme Não consigo pensar em outro que não seja a IFormattableinterpolação de strings.
I3arnon 9/09/15
2
Acho que podemos dizer que todos os açúcares sintáticos podem ser usados ​​e direcionados para versões mais antigas do framework. Tudo bem dizer isso?
Mkb
4
@mkb yes. O açúcar sintático é exatamente aqueles recursos que dependem apenas dos recursos do compilador e não dos recursos da estrutura.
I3arnon 15/06/2016
52

Só quero focar em como entender a Wikipedia e outros links.

Quando a Wikipedia diz que o C # 6.0 está no .NET Framework 4.6, significa simplesmente que a versão de produção do compilador (msc.exe) fará parte da versão do .NET Framework 4.6. Através da segmentação múltipla , esses compiladores podem suportar versões inferiores das versões do .NET Framework. Obviamente, desde que Roslyn se tornou um projeto de código aberto, o compilador agora é completamente um componente individual.

Quando algo se refere à versão CLR do 4.0.30319 (.0), na verdade pode ser o .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Pois todos implementam o Especificação da versão 4 do CLR. Sem mencionar que o Xamarin / Mono também implementa a mesma especificação CLR.

A página MSDN ainda não está totalmente atualizada, mas algumas páginas já possuem o .NET Framework 4.6 listado na seção Informações da versão.

No total, as especificações de idioma (assim como o compilador C #), as especificações CLR e as versões do .NET Framework não estão intimamente associadas. Ele oferece aos desenvolvedores flexibilidade suficiente para utilizar novos compiladores para direcionar CLRs e .NET Frameworks mais antigos.

Lex Li
fonte
29

Sim, você pode usar compiladores mais novos para estruturas mais antigas e obter acesso aos novos recursos do compilador (desde que esses recursos não exijam novos tipos introduzidos no .NET 4.6).

Outros exemplos disso são métodos com parâmetros padrão introduzidos no C # 4.0 (.NET 4.0), mas você pode usá-los nos projetos .NET 2.0 (C # 2.0) e .NET 3.5 (C # 3.0).

Você também pode usar os Métodos de Extensão (introduzidos no C # 3.0) no .NET 2.0 ou .NET 3.0 se você executar uma solução alternativa pequena para deixar o compilador feliz e encontrar um atributo que foi introduzido no .NET 3.5.

Scott Chamberlain
fonte
1

Se você estiver usando scripts de construção, lembre-se de alterar o caminho para o novo construtor:

defina CPATH = C: \ Arquivos de programas (x86) \ MSBuild \ 14.0 \ Bin

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END
oobe
fonte
1

Responder por @oobe é realmente importante. Eu poderia criar minha solução através de um arquivo em lotes somente depois de usar o MSBuild.exe em C: \ Arquivos de Programas (x86) \ MSBuild \ 14.0 \ Bin .

Suryakant Soni
fonte