O Visual C# 2008 separável alterações
Alterações significativas no Visual 2008 translation from VPE for Csharp serviço empacotar 1
A tabela a seguir lista todas as alterações recentes Visual C# 2008 serviço empacotar 1 que podem afetar um aplicativo que foi criado na versão original do Visual C# 2008 ou no Visual C# 2005.
Alterar número |
Category (Categoria) |
Problema |
Descrição |
---|---|---|---|
1 |
Resolução de sobrecarga |
inferência de tipos de tipos agora está incluída em matrizes de tipos de ponteiro na resolução de sobrecarga de método. |
No Visual C# 2008 e anteriores, inferência de tipos de tipos faz com que matrizes de tipos de ponteiro a serem excluídos do processo de resolução de sobrecarga de método.O código a seguir, o compilador do Visual C# 2005 seleciona a versão não-genéricas de Test porque a versão genérica do Test é excluído da consideração causa de seu parâmetro de tipo int*[]. No Visual C# 2008, a versão genérica de Test está selecionada.
|
2 |
Indexadores |
Agora, o compilador produz erro CS0466 indexadores e propriedades, além de métodos. |
Em versões anteriores e a versão original do Visual C# 2008, é possível definir uma implementação explícita de um indexador em que a implementação tem um params parâmetro, mas a definição de interface não permite. Essa construção é contrário à especificação.No Visual C# 2008 SP1, essa construção produz CS0466 de erro do compilador, sistema autônomo mostra o código a seguir.
} |
3 |
Tipos anuláveis e ?? expressões |
Compilador agora corretamente avalia expressões nos quais variáveis anuláveis são comparadas entre si. |
Na versão original do Visual C# 2008, o código a seguir compila e gera "false" em time de execução.No Visual C# 2008 serviço empacotar 1, Compilador CS1718 de aviso (nível 3)é gerada e "verdadeiro" é de saída.
|
4 |
try-finally em iteradores |
Execução do aninhados finally blocos de iteradores ter break instruções é alterado. |
Na versão original do Visual C# 2008, o código a seguir executa a externa finally duas vezes. No Visual C# 2008 SP1, a externafinally é executado uma vez.
|
5 |
Árvores de expressão |
conversão boxing incorreta de método de expressões em árvores de expressão não ocorre. |
Na versão original do Visual C# 2008, o código a seguir produz 7, 0.A linha Console.WriteLine(e.Compile()(default(T))); saídas zero porque S Processador in a box é incorretamente sendo Intel. No Visual C# 2008 SP1, não há conversão boxing ocorre e o programa gera 7, 7.
|
6 |
Inicializadores de objeto |
Inicialização de tipos de valor em inicializadores de objeto foi corrigida. |
A versão original do Visual C# 2008, a variável localb no exemplo a seguir não foi inicializado corretamente e seus membros X tem um valor igual a zero. No Visual C# 2008 SP1, S.X inicializada corretamente como 1 em ambos new expressões.
|
7 |
Conversões de tipo |
nulo literais não são mais conversível em valores de enum. |
No versão original do Visual C# 2008, nulo literais são em alguns casos, podem ser convertidas em valores de enum.No Visual C# 2008 SP1, CS1502 de erro do compilador e CS1503 de erro do compilador são produzidos se você tentar fazer isso, conforme mostrado no exemplo a seguir.
|
8 |
Árvores de expressão |
Árvore de expressão inválido agora lança a exceção correta. |
Na versão original do Visual C# 2008, uma árvore de expressão que contenha uma telefonar de método para um método que não está no tipo especificado lança um System.Security.VerificationException. No Visual C# 2008 SP1, um System.ArgumentException é lançada, sistema autônomo mostra o código a seguir.
|
9 |
Atributos |
CharSet.Unicode agora é propagada para tipos de auxiliar translation from VPE for Csharp gera para campos de matriz fixo. |
O compilador translation from VPE for Csharp gera tipos auxiliar para encapsular arrays fixos.A versão original do Visual C# 2008 e versões anteriores, o layout da matriz é sempre ANSI, mesmo se o StructLayout atributo especifica CharSet.Unicode. Não havia nenhuma forma para alterar o que nos translation from VPE for Csharp código-fonte.No Visual C# 2008 SP1, qualquer valor CharSet for especificado no StructLayout atributo é usado para construir a classe auxiliar, sistema autônomo mostra o código a seguir.
|
10 |
Verificação de estouro |
stackalloc agora executa uma verificação de estouro. |
Na versão original do Visual C# 2008, é possível que um stackalloc alocação falhar sem causar uma exceção. Isso é por causa de uma instrução mul não verificado na gerado Microsoft intermediate linguagem (MSIL) quando o comprimento da matriz é multiplicado pelo dimensionar de cada elemento.No Visual C# 2008 SP1, uma instrução mul.ovf é gerada em vez de mul, para que estouros de produzem um System.OverflowEx ception Quando a alocação é tentada em time de execução.
|
11 |
Operadores de consulta padrão |
Consultas sobre coleções não genéricas agora usam semântica translation from VPE for Csharp projeção padrão. |
Em expressões de consulta LINQ sobre coleções não genéricas, sistema autônomo System.Collections.ArrayList, o from cláusula da consulta é regravada pelo compilador para incluir uma telefonar para o Cast<T> operador. Cast<T> Converte todos os tipos de elemento para o tipo especificado na from cláusula da consulta. Além disso, na versão original do Visual C# 2008, a Cast<T> operador também executa algumas conversões de tipo de valor e conversões definidas pelo usuário. No entanto, essas conversões são executados usando o System.Convert classe em vez da semântica translation from VPE for Csharp padrão. Essas conversões também causar problemas significativos de desempenho em determinados cenários.No Visual C# 2008 SP1, a Cast<T> operador é modificado para lançar um InvalidCastException para o tipo de valor numérico e conversões definidas pelo usuário. Essa alterar elimina tanto a semântica de elenco translation from VPE for Csharp não padrão e o problema de desempenho.Essa alterar é ilustrada no exemplo a seguir.
|
Alterações significativas na versão release original do Visual C# 2008
A tabela a seguir lista todas as alterações recentes na versão original do Visual C# 2008 que podem impedir que um aplicativo criado no Visual C# 2005 compilação ou que podem mudar seu comportamento em time de execução.
Alterar número |
Category (Categoria) |
Problema |
Descrição |
---|---|---|---|
12 |
Conversões de tipo |
Conversão de qualquer expressão de constante com valor de zero a enum agora é permitido. |
Um literal 0 é implicitamente conversível para qualquer tipo enum.No Visual C# 2005 e versões anteriores do compilador, também há algumas expressões constante avaliados como 0, que pode converter implicitamente a qualquer tipo enum mas a regra que determina quais essas expressões são conversíveis não está claro.No Visual C# 2008, todas as expressões constante que são iguais a 0 podem ser convertidas implicitamente a qualquer tipo enum. Isso poderia causar algumas alterações no comportamento do código existente, sistema autônomo resolução de sobrecarga de método baseia-se na ausência dessa conversão implícita.O código a seguir compila com êxito no Visual C# 2005 e compiladores anteriores, resolver a invocação do método do valor curto apenas para a sobrecarga de int.No Visual C# 2008, essa chamada é ambígua porque o valor curto também é implicitamente conversível no E. No Visual C# 2008, o comportamento é alterado para permitir a conversão de qualquer expressão de constante que é avaliada como zero.
|
13 |
Atributos |
Agora o erro ocorre quando o mesmo atributo TypeForwardedTo está presente duas vezes em um assembly. |
No Visual C# 2005, nenhum erro é gerado se um assembly contém dois atributos sistema.tempo de execução.CompilerServices.TypeForwardedTo destino o mesmo tipo.No Visual C# 2008, CS0739 de erro do compilador é produzido, conforme mostrado no exemplo a seguir.
} |
14 |
Erros de tipo |
Foi adicionado um novo aviso sobre o uso de um membro de tipo de referência em uma struct. |
Regras de atribuição definitiva para structs exigem que seja a estrutura de struct conjunto a uma instância existente do seu tipo ou que cada um dos seus membros ser atribuído antes que ela é referenciada.No Visual C# 2005, não é produzido nenhum aviso ou erro quando um membro de tipo de referência não atribuída de uma estrutura é usado.No Visual C# 2008, Compilador CS1060 de aviso (nível 1) é produzido, conforme mostrado no exemplo a seguir.
|
15 |
Verificação de estouro |
Verificação de intervalo em const Decimal de tipos foi corrigido. |
No Visual C# 2005, quando você converter Const tipos decimal, verificação de intervalo não é sempre correto e erros do compilador incorreta podem resultar.No Visual C# 2008, o código a seguir produz o corrigir o erro: CS0031 de erro do compilador.
|
16 |
Verificação de estouro |
Out-of-Bounds conversões para long Agora, produza o erro de compilador correto. |
No Visual C# 2005, o código a seguir não produz um erro do compilador.No Visual C# 2008, ela produz CS0031 de erro do compilador.
|
17 |
Buffers de dimensionar fixo |
Acessar um buffer de tamanho fixo em uma struct não seguro antes de atribuir um valor para o buffer agora produz um erro do compilador. |
Regras de atribuição definitiva para ponteiros não seguros exigem que o ponteiro ser definida antes de cancelar a referência do ponteiro.No Visual C# 2005, quando um struct não seguro contém um ponteiro para uma matriz, acessar o ponteiro antes de atribuir um valor a ela não produziu um erro do compilador.No Visual C# 2008, isso produz CS0165 de erro do compilador, sistema autônomo mostra o código a seguir.
|
18 |
Efeitos colaterais agora são preservados em expressões unindo nulo. |
Atribuição definitiva e o ?? operador. |
No Visual C# 2005, em determinados cenários, os efeitos colaterais no lado esquerdo de um valor nulo concentração expressão não serão preservados.Em tais casos, o segundo Console.WriteLine demonstrativo no exemplo a seguir produzirá um erro de compilador incorreta afirmando que b é não atribuído. No Visual C# 2008, o mesmo código é compilado corretamente sem erro.
} |
19 |
try-finally em iteradores |
The finally bloco agora é executado quando um iterador na try bloco elimina com continue ou goto. |
No Visual C# 2005, em um try-finally construção, quando bloquear controle passa de um iterador na try bloco usando um goto ou continue demonstrativo, o finally bloco não é executado. No Visual C# 2008, a finally bloco é executado nesses casos.
} |
20 |
Interfaces e classes base |
Construção de classe agora ignora implementações explícitas os mesmos membros da interface em classes base. |
No Visual C# 2005, quando uma classe não oferece uma implementação de um membro da interface, o compilador substitui implementações de classe base, mesmo que elas são declaradas sistema autônomo implementações de interface explícita.Esse comportamento não está em conformidade com a especificação ECMA (European Computer Manufacturers associação).O Visual C# 2008 corretamente implementa a especificação.No exemplo a seguir, o Visual C# 2005 imprime "B.teste".Visual C# 2008 "A.teste" imprime corretamente e ignora oTest método na classe B porque é uma implementação explícita da interface.
} |
21 |
Atributos |
Uso de um membro obsoleto agora gera um aviso do compilador. |
Você pode marcar métodos com o Obsolete atributo de causar erros ou avisos em time de compilar se os métodos são chamados. Quando você coloca este atributo em métodos virtual, o atributo deve ser colocado no método base.Se o Obsolete atributo é colocado em um método substituir, ele não causará avisos ou erros do compilador na invocação. No Visual C# 2005, o compilador permitia que você coloca o Obsolete o atributo em um método de substituir, mesmo que o atributo não tenha qualquer efeito quando ele foi colocado lá. No Visual C# 2008, de aviso do compilador Compilador CS0809 de aviso (nível 1)produzido, "membro obsoleto 'A.Filename' substitui o membro não obsoleto 'erro.Filename'." O exemplo a seguir faz com que esse aviso.
|
22 |
Erros de compilação |
Uso do /pdb sem opção do compilador /debug Agora, produzirá um erro. |
No Visual C# 2005, nenhum aviso ou erro é exibido quando você especificar o /pdb opção, mas não o /debug opção. Translation from VPE for Csharp Visual apenas cria uma criação para versão sem gerar arquivo .pdb.A versão original do Visual C# 2008, se você especificar /pdb sem especificar /debug, o compilador exibirá CS2036 de erro do compilador. |
23 |
Erros de tipo |
Um erro agora é produzido quando um switch condição será anulada. |
No Visual C# 2005, nenhum erro será gerado quando um void invocação de método é usada em um comutador demonstrativo.No Visual C# 2008, CS0151 de erro do compilador é produzido.
} |
24 |
Verificação de estouro |
constante Decimal para integral conversões agora produzem um erro do compilador diferentes. |
No Visual C# 2005, o código a seguir produziria CS0133 de erro do compilador: "A expressão que está sendo atribuída a 'b' deve ser constante."
No Visual C# 2008, CS0031 de erro do compilador é gerado: "Valor constante 256 ' M ' não pode ser convertido em um byte." Observe que o erro é produzido, mesmo que o unchecked modificador é aplicado. |
25 |
Expressões constante |
Especificação de mais de perto é seguida sobre expressões constante. |
No Visual C# 2008, vários problemas foram corrigidos no qual Visual C# 2005 incorretamente permitiria variáveis e operadores em expressões de constante.No Visual C# 2005, o código a seguir é compilado sem erros.No Visual C# 2008, CS0165 de erro do compilador , Compilador CS0184 de aviso (nível 1) , e Compilador CS1718 de aviso (nível 3) são produzidos:
|
26 |
Erros de tipo |
Agora, um erro é produzido quando um tipo estático é usado sistema autônomo um parâmetro em um delegado ou em uma expressão lambda. |
No Visual C# 2005, nenhum erro é gerado se um tipo estático for usado sistema autônomo um parâmetro a um delegado ou método anônimo.Tipos estático não podem ser usados sistema autônomo sistema autônomo tipos de parâmetros do método porque não pode ser instanciadas.Versão do compilador Visual C# 2005 permite tipos estático sistema autônomo tipos de parâmetro em delegados e declarações de método anônimo.Se você passar nulo sistema autônomo parâmetro, tais delegados podem ser chamados.No Visual C# 2008, erro CS0721 de erro do compilador é gerada se um tipo estático for usado sistema autônomo um parâmetro a um delegado ou método anônimo, conforme mostrado no exemplo a seguir.
} |
27 |
Tipos anuláveis e ?? expressões |
Nenhum aviso é produzido quando você converter uma constante para um tipo que permite valor nulo antes de atribuí-lo a anulável (de um tipo maior). |
No Visual C# 2005, o código a seguir produziria Compilador CS0219 de aviso (nível 3). No Visual C# 2008, nenhum aviso é gerado.
|
28 |
Resolução de sobrecarga |
Um erro agora é produzido quando a resolução de sobrecarga ambíguo ocorre em métodos anônimo. |
Chamadas de método em métodos sobrecarregados devem ser resolvidas pelo compilador para determinar qual sobrecarga específica para invocar.Quando tipo de parâmetro de uma invocação é inferido parcialmente, a sobrecarga específica para invocar pode tornar-se ambíguo.Isso faz com que um erro do compilador. No caso de um método anônimo que está sendo passado sistema autônomo um parâmetro delegado, tipo de delegado do método anônimo é inferido parcialmente.Isso pode levar à ambigüidade quando o compilador está selecionando a sobrecarga correta. No Visual C# 2005, o compilador não sempre produz um erro quando não houver nenhuma sobrecarga melhor única para um método anônimo.No Visual C# 2008, CS0121 de erro do compilador é produzido, conforme mostrado no exemplo a seguir.
|
29 |
Erros de tipo |
Um erro é produzido agora se você declarar uma matriz de ponteiros para os tipos gerenciado. |
Ponteiros não seguros para tipos de referência não são permitidos e que causem erros do compilador.No Visual C# 2005, é possível declarar uma matriz de ponteiros para os tipos gerenciado.No Visual C# 2008, CS0208 de erro do compilador é gerado: "Não é possível obter o endereço de obter o dimensionar da ou declara um ponteiro para um tipo gerenciado (' t ')."
} |
30 |
Resolução de sobrecarga |
Um aviso agora é produzido quando métodos de candidato de resolução de sobrecarga variam por apenas ref ou out. |
No Visual C# 2005, quando o compilador translation from VPE for Csharp executa resolução de sobrecarga em tipos genéricos, ele não verifica se os argumentos de tipo fará com que o candidato a métodos variar por apenas ref ou out. sistema autônomo resultado, a escolha de métodos é da esquerda para o common linguagem tempo de execução (CLR) em time de execução e apenas ele seleciona o primeiro método na lista.No Visual C# 2008, Compilador CS1956 de aviso (nível 1) é produzido quando o compilador detecta que dois métodos de candidatos para a resolução de sobrecarga variará de acordo com a única ref ou out. Essa condição é ilustrada no exemplo a seguir.
} |
31 |
Tipos anuláveis e??expressões |
Uma expressão com nulo no lado esquerdo concentração nulo não é avaliada sistema autônomo uma constante nula. |
No Visual C# 2005, uma expressão com nulo no lado esquerdo concentração nulo é avaliada sistema autônomo uma constante nula.No Visual C# 2008, isso não é o caso.No alguns casos, o Visual C# 2005 comportamento permite que variáveis sejam tratadas incorretamente sistema autônomo definitivamente atribuído.O código a seguir compila e executa sem erros no Visual C# 2005, mas no Visual C# 2008, CS0165 de erro do compilador é gerado: "Uso de variável local não atribuído 'x'."
|
Consulte também
Outros recursos
Guia de Introdução ao Visual C#
Date |
History |
Motivo |
---|---|---|
Julho de 2008 |
Tópico adicional. |
Alteração de recurso do SP1. |