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);
}
}
- A Wikipedia diz que o .NET framework para C # 6.0 é 4.6.
- Esta pergunta (e o teste CTP do Visual Studio 2015 ) diz que a versão do CLR é 4.0.30319.0.
- Esta página do MSDN informa que o .NET 4, 4.5, 4.5.2 usa o CLR 4. Não há informações sobre o .NET 4.6.
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?
Respostas:
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
):Você precisa do .Net 4.6 para usá-lo,
IFormattable
pois somente a nova versão do framework adicionaSystem.FormattableString
: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.
fonte
IFormattable
interpolação de strings.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.
fonte
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.
fonte
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]
fonte
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 .
fonte