Ho provato a contrassegnare una proprietà della raccolta su una classe come Obsoleta per trovare tutte le occorrenze e mantenere un elenco di restringimenti delle cose da correggere nella mia lista di avvisi, a causa del fatto che abbiamo bisogno di sostituire questa proprietà di raccolta con qualcos'altro.Perché le proprietà della raccolta C# non vengono contrassegnate come obsolete quando si richiamano le proprietà su di esse?
Edit: Ho presentato questo attraverso Microsoft Connect, issue #417159.
Modifica 16.11.2010: verificato che questo ora funziona nel compilatore C# 4.0, sia durante la compilazione per .NET 3.5 e 4.0. Ricevo 4 avvisi nel codice pubblicato, incluso quello con il commento "Non è OK?".
Tuttavia, con mia grande sorpresa, la lista conteneva solo poche occorrenze, molto meno di quanto sapevo che c'erano, e spotchecks mi dice che per qualche motivo, l'utilizzo della proprietà non è sempre contrassegnato come obsoleto dal compilatore nella lista di avvisi.
Ecco un esempio di programma, pronti per compilare in Visual Studio 2008.
Nota le quattro linee verso la fine con i tag # 1- # 4, di questi, mi aspetto tutti loro di riferire che la la proprietà utilizzata era obsoleta, ma # 3 non lo è, e sembra che se si passa direttamente alle proprietà o ai metodi della raccolta direttamente, l'utilizzo della proprietà stessa non viene contrassegnato come obsoleto. Nota che il n. 3 e il n. 4 fanno riferimento alla stessa proprietà e il n. 4 è contrassegnato come se utilizzasse una proprietà obsoleta, mentre il n. 3 non lo è. I test mostrano che se, nell'espressione, accedo alle proprietà o ai metodi della raccolta restituiti dalla proprietà, il compilatore non si lamenta.
Si tratta di un bug o di una "gemma nascosta" del compilatore C# di cui non ero a conoscenza?
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
}
}
}
Ho segnato il vostro "connect" come convalidato e dato un voto ... –
btw, non vorrei anticipare una correzione prima di C# 4.0 ; il codice sarebbe compilato in 2.0? Forse prova il compilatore 2.0 ... –
nah, ce la faremo, l'ho scoperto solo per errore quando ho provato ad usare ObsoleteAttribute come un modo veloce per ottenere una lista "da fare" per le cose da sistemare prima di procedere con il refactoring. –