C#


1 Requerimentos de sistema

O bug relacionado neste post foi detectado utilizando-se os softwares abaixo:
• Windows Vista Enterprise Edition SP1.
• Visual Studio Team System 2008 (2008 9.0.21022.8 RTM).
• .NET Framework 3.5.
• Compilador C# 3.5.21022.8

2 Demonstração

Veja abaixo um exemplo de utilização do atributo Obsolete:

public class User
{
    private System.Collections.Generic.Dictionary<int, string> users;

    [System.Obsolete(”Esta propriedade está obsoleta.”, true)]
    public System.Collections.Generic.Dictionary<int, string> Users
    {
        get
        {
            return this.users;
        }
    }

    public User()
    {
        this.users=new System.Collections.Generic.Dictionary<int,string>();
        this.users.Add(0, “Evandro de Paula”);
    }
}

Note que a propriedade Users foi marcada como obsoleta, onde os parâmetros abaixo foram definidos como:
message = “Esta propriedade está obsoleta” (mensagem de erro ou alerta que é exibida durante a compilaçào quando a propriedade for utilizada).
error = true (indica que a utilização da propriedade obsoleta deve implicar em um erro de compilação).

Conforme o esperado, quando compilamos o código abaixo, obtemos um erro na linha em destaque:

class Program
{
    static void Main(string[] args)
    {
        User user = new User();
        System.Collections.Generic.Dictionary users=user.Users;
        System.Console.ReadLine();
    }
}

Entretanto, se implemetarmos a alteração em destaque abaixo, onde não utilizamos diretamente a propriedade obsoleta, mas sim um elemento da coleção, notaremos que nenhum erro é informado durante o processo de compilação:

class Program
{
    static void Main(string[] args)
    {
        User user = new User();
        System.Console.WriteLine("Name: " + user.Users[0]);
        System.Console.ReadLine();
    }
}

3 Conclusão

Mantenha atenção redrobrada no emprego do atributo Obsolete na tentativa de minimizar a possibilidade de comportamentos inesperados pelo sistema.
A boa notícia é que a correção deste bug já foi providenciada pelo time da Microsoft e deve estar disponível na próxima versão da plataforma .NET.

4 Código-fonte

Você pode baixar o código-fonte desta ferramenta no endereço http://www.orchestratechnology.com.br/blog/csharp/ObsoleteCheck.zip.

O exemplo abaixo é um código que compila sem problema algum, porém, durante a sua execução lança a exceção System.ArrayTypeMismatchException na linha em que o inteiro 1 é atribuído a posição 0 do array b.

using System;

namespace CompilerTypeCheck
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string[] a = new string[3];
                object[] b = a;
                b[0] = 1;
            }
            catch (System.ArrayTypeMismatchException atmex)
            {
                System.Console.WriteLine("An error occured while executing this program. Error details: " + atmex.StackTrace);
            }

            System.Console.WriteLine("Press  to exit…”);
            System.Console.ReadLine();
        }
    }
}