c# properties obsolete

¿Por qué las propiedades de colección de C#no se marcan como obsoletas cuando se llaman propiedades sobre ellas?



properties obsolete (3)

Estoy de acuerdo con Marc: parece un error de compilación. Curiosamente, gmcs (el compilador de Mono C #) lo hace bien:

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)

Traté de marcar una propiedad de colección en una clase como Obsoleto para encontrar todas las ocurrencias y mantener una lista cada vez más pequeña de cosas que corregir en mi lista de advertencia, debido al hecho de que tenemos que reemplazar esta propiedad de la colección por otra cosa.

Editar : He enviado esto a través de Microsoft Connect, número 417159 .

Editar 16.11.2010 : verificado que esto ahora funciona en el compilador de C # 4.0, ambos al compilar para .NET 3.5 y 4.0. Recibo 4 advertencias en el código publicado, incluida la que tiene el comentario "¿No está bien?".

Sin embargo, para mi sorpresa, la lista solo contenía algunas ocurrencias, mucho menos de lo que yo sabía que había, y las comprobaciones puntuales me dicen que, por alguna razón, el uso de la propiedad no siempre está marcado como obsoleto por el compilador en la lista de advertencia. .

Aquí hay un programa de ejemplo, listo para compilar en Visual Studio 2008.

Tenga en cuenta las cuatro líneas cerca del final etiquetados con # 1- # 4, de estos, esperaría que todos ellos informaran que la propiedad utilizada era obsoleta, pero la # 3 no lo es, y parece que si solo sigo adelante directamente a las propiedades o métodos de recopilación, el uso de la propiedad en sí no está marcado como obsoleto. Tenga en cuenta que # 3 y # 4 hacen referencia a la misma propiedad, y # 4 está marcado como que usa una propiedad obsoleta, mientras que # 3 no lo está. Las pruebas muestran que si, en la expresión, accedo a las propiedades o métodos de la colección que devuelve la propiedad, el compilador no se queja.

¿Es esto un error, o es esta una "gema oculta" del compilador de C # del que no tenía conocimiento?

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 } } }


Hmm ... ¡parece un error de compilación para mí! No cumple con lo siguiente (ECMA 334v4):

24.4.3 El atributo Obsoleto El atributo Obsoleto se utiliza para marcar tipos y miembros de tipos que ya no deberían utilizarse. Si un programa utiliza un tipo o miembro que está decorado con el atributo Obsoleto, entonces el compilador emitirá una advertencia o un error para alertar al desarrollador, por lo que el código ofensivo puede ser reparado. Específicamente, el compilador emitirá una advertencia si no se proporciona ningún parámetro de error, o si se proporciona el parámetro de error y tiene el valor falso. El compilador emitirá un error de tiempo de compilación si el parámetro de error está especificado y tiene el valor verdadero.

En particular, cuando se marque como verdadero, debería emitir un error, y no es así. ¡Buen descubrimiento! Puede informarlo en "conectarse", o si no desea el dolor de configurar un inicio de sesión, hágamelo saber y estaré encantado de iniciar sesión (haciendo referencia a su publicación aquí, sin intentar "robar" nada).

(actualizar)

Código reducido para 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 compilador MS C # 2.0. Es solo el compilador MS C # 3.0 (.NET 3.5) que está roto.


Este es un error genuino. Lamentablemente, debido a una limpieza de refactorización que se perdió este caso. Arreglé esto para el lanzamiento del compilador de C # 4.0 en VS 2010 / NDP 4.0, pero no hay planes para arreglarlo ahora en Orcas y desafortunadamente no hay ningún trabajo que conozca para lidiar con esto.

Odio decirlo, pero deberá actualizar a NDP 4 csc.exe o VS2010 cuando estén disponibles para solucionar este problema.

Estoy pensando en publicar una entrada en mi nuevo blog msdn sobre esto. Es un buen ejemplo anecdótico de cómo la refacturación puede romper tu código.

Ian Halliday

C # Compiler SDE
Microsoft