¿Por qué C # collection-propiedades no marcados como obsoletos cuando se llama a las propiedades en ellos?

StackOverflow https://stackoverflow.com/questions/577132

  •  05-09-2019
  •  | 
  •  

Pregunta

He intentado marcar una propiedad de colección en una clase como obsoleto para encontrar todas las ocurrencias y mantener una lista cada vez menor de las cosas para fijar en mi advertencia de vinos, debido al hecho de que tenemos que reemplazar esta propiedad de colección con otra cosa .


Editar : He presentado esto a través de Microsoft Connect, edición # 417159 .

Editar 16.11.2010 : demostró que este ahora trabaja en el compilador de C # 4.0, tanto cuando se compila para .NET 3.5 y 4.0. Tengo 4 advertencias en el código publicado, incluyendo el uno con el comentario "No OK?".


Sin embargo, para mi sorpresa, la lista sólo contenía unas pocas ocurrencias, un número mucho menor de lo que yo sabía que había, y spotchecks me dice que por alguna razón, el uso de la propiedad no siempre se marca como obsoletas por el compilador de la lista de advertencia.

El siguiente es un ejemplo de programa, listo para compilar en Visual Studio 2008.

Tenga en cuenta las cuatro líneas cerca del final etiquetado con # 1- # 4, de estos, yo esperaría que todos ellos para informar de que la propiedad utilizada era obsoleto, pero # 3 no es, y parece que si acaba de pasar a las propiedades de la colección o métodos directamente, el uso de la propiedad en sí no está marcado como obsoleto. Tenga en cuenta que # 3 y # 4 hace referencia a la misma propiedad, y # 4 se marca como el uso de una propiedad obsoletos, mientras que # 3 no es. Las pruebas muestran que, si en la expresión, yo acceder a propiedades y métodos de la colección de los retornos de propiedad, el compilador no se queja.

Es esto un error, o se trata de un "tesoro escondido" del compilador de C # yo no era consciente de?

using System;
using System.Collections.Generic;

namespace TestApp
{
    public abstract class BaseClass
    {
        [Obsolete]
        public abstract String Value
        {
            get;
        }

        [Obsolete]
        public abstract String[] ValueArray
        {
            get;
        }

        [Obsolete]
        public abstract List<String> ValueList
        {
            get;
        }
    }

    public class DerivedClass : BaseClass
    {
        [Obsolete]
        public override String Value
        {
            get
            {
                return "Test";
            }
        }

        [Obsolete]
        public override String[] ValueArray
        {
            get
            {
                return new[] { "A", "B" };
            }
        }

        [Obsolete]
        public override List<String> ValueList
        {
            get
            {
                return new List<String>(new[] { "A", "B" });
            }
        }
    }

    public class Program
    {
        public static void Main(String[] args)
        {
            BaseClass bc = new DerivedClass();
            Console.Out.WriteLine(bc.Value);             // #1 - OK
            Console.Out.WriteLine(bc.ValueArray.Length); // #2 - OK
            Console.Out.WriteLine(bc.ValueList.Count);   // #3 - Not OK?
            List<String> list = bc.ValueList;            // #4 - OK
        }
    }
}
¿Fue útil?

Solución

Hmm ... se parece a un error del compilador para mí! Fracasa la siguiente (ECMA 334v4):

  

24.4.3 El atributo obsoleto El atributo obsoleto se utiliza para marcar   tipos y miembros de tipos que deberían   ya no ser utilizado. Si un programa utiliza una   tipo o miembro que está decorado con   el atributo obsoleto, entonces la   compilador emitirá una advertencia o   de error con el fin de alertar a la promotora,   por lo que el código erróneo puede ser fijo.   En concreto, el compilador emitirá   una advertencia si no hay parámetro de error es   proporcionado, o si el parámetro de error es   proporcionado y tiene el valor FALSE. los   compilador emitirá un tiempo de compilación   error si el parámetro de error es   especificado y tiene el valor verdadero.

En particular, si se ha hecho cierto que debe emitir un error, y no lo hace. ¡Buen descubrimiento! Se podría informar de ello en "conectar", o si no desea que el dolor de la creación de un inicio de sesión, hágamelo saber y voy a entrar felizmente ella (en incluir su post aquí; ningún intento de "robar" nada) <. / p>

(actualización)

Código Reducido a reproducir:

using System;
using System.Collections.Generic;
static class Program {
    static void Main() {
        int count = Test.Count;
    }

    [Obsolete("Should error", true)]
    public static List<string> Test {
        get {throw new NotImplementedException();}
    }
}

Tenga en cuenta que Mono 2.0 lo hace bien, al igual que el MS C # 2.0 compilador. Es sólo el compilador MS C # 3.0 (.NET 3.5) que está roto.

Otros consejos

Esto es un error genuino. Desafortunadamente, debido a una refactorización limpiar que no alcanzaron este caso. Me fijo esto para el C # 4.0 versión del compilador que vienen en VS 2010 / NDP 4.0 pero no hay planes para solucionar ahora en orcas y por desgracia no hay trabajo en torno a que conozco para hacer frente a esto.

No me gusta decirlo, pero usted tendrá que actualizar a la csc.exe NDP 4 o VS2010 cuando se encuentren disponibles para solucionar este problema.

Estoy pensando en publicar una entrada en mi blog de MSDN de nuevo y fresco sobre esto. Hace un buen ejemplo de cómo anecdótica refactorización puede romper su código.

Ian Halliday

compilador de C # SDE
Microsoft

Estoy de acuerdo con Marc: se ve como un error del compilador. Curiosamente, GMC (el Mono compilador de C #) en el clavo:

Test.cs(65,26): warning CS0219: The variable `list' is assigned but its value is never used
Test.cs(62,38): warning CS0612: `TestApp.BaseClass.Value' is obsolete
Test.cs(63,38): warning CS0612: `TestApp.BaseClass.ValueArray' is obsolete
Test.cs(64,38): warning CS0612: `TestApp.BaseClass.ValueList' is obsolete
Test.cs(65,36): warning CS0612: `TestApp.BaseClass.ValueList' is obsolete
Compilation succeeded - 5 warning(s)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top