Perché C # di raccolta-properties non contrassegnati come obsoleti quando si chiama proprietà su di loro?

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

  •  05-09-2019
  •  | 
  •  

Domanda

Ho cercato di bandiera una proprietà della raccolta su una classe come obsoleti per trovare tutte le occorrenze e mantenere una lista contrazione delle cose da correggere nella mia warning-list, a causa del fatto che abbiamo bisogno di sostituire questa proprietà collezione con qualcos'altro .


Modifica : Ho presentato questo attraverso Microsoft Connect, numero # 417.159 .

Modifica 16.11.2010 : verificato che questo ora lavora nel compilatore C # 4.0, sia durante la compilazione per NET 3.5 e 4.0. Ottengo 4 avvertimenti nel codice scritto, tra cui quella 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 in la lista di avvertimento.

Ecco un esempio di programma, pronti per compilare in Visual Studio 2008.

Si notino le quattro linee verso la fine con i tag # 1- # 4, di questi, mi aspetto tutti loro di riferire che la proprietà utilizzata era obsoleto, ma # 3 non è, e sembra che se io solo passare alle proprietà di raccolta o metodi direttamente, l'utilizzo della struttura in sé non è contrassegnato come obsoleto. Si noti che # 3 e # 4 fa riferimento la stessa proprietà, e # 4 è contrassegnata come utilizzare una proprietà obsoleta, mentre 3 # non è. I test dimostrano che, se, nell'espressione, accedo proprietà o metodi della raccolta dei rendimenti di proprietà, il compilatore non si lamenta.

Questo è un bug, o si tratta di una "gemma nascosta" del compilatore C # non ero a conoscenza di?

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
        }
    }
}
È stato utile?

Soluzione

Hmm ... sembra un bug del compilatore a me! Non riesce il seguente (ECMA 334v4):

  

24.4.3 L'attributo obsoleto L'attributo obsoleto viene utilizzato per contrassegnare   tipi e membri di tipi che dovrebbero   non è più utilizzabile. Se un programma utilizza un   tipo o membro che è decorato con   l'attributo Obsoleto, allora la   compilatore emette un avvertimento o   errore al fine di avvisare lo sviluppatore,   quindi il codice dannoso può essere risolto.   In particolare, il compilatore rilascia   un avviso se nessun parametro di errore è   disponibile, o se il parametro di errore è   disponibile e ha il valore falso. Il   compilatore rilascia un tempo di compilazione   errore se il parametro di errore è   specificata e ha il valore true.

In particolare, quando segnato vero dovrebbe emettere un errore, e non è così. Buona scoperta! Si potrebbe riferire su "connect", o se non si desidera che il dolore della creazione di un account di accesso, fatemelo sapere e io felicemente il login esso (referenziare la tua post qui, nessun tentativo di "rubare" qualcosa) <. / p>

(aggiornamento)

Codice Ridotto a riprodurre:

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();}
    }
}

Si noti che mono 2.0 ottiene di destra, così come la # 2.0 compilatore MS C. E 'solo il MS C # 3.0 (.NET 3.5) compilatore che è rotto.

Altri suggerimenti

Questo è un vero e proprio bug. Purtroppo a causa di un refactoring ripulire che ha mancato questo caso. Ho fissato questo per la versione C # 4.0 del compilatore che si sviluppano nel VS 2010 / NDP 4.0, ma non ci sono piani per risolvere il problema ora in Orcas e purtroppo non c'è lavoro in giro che conosco per affrontare la questione.

Mi dispiace dirlo, ma è necessario eseguire l'aggiornamento alla csc.exe NDP 4 o VS2010 quando diventano disponibili per risolvere questo problema.

Sto pensando di inviare una voce sul mio fresco nuovo blog MSDN su questo. Fa un buon esempio di come aneddotica refactoring può rompere il codice.

Ian Halliday

C # Compiler SDE
Microsoft

Sono d'accordo con Marc: sembra un bug del compilatore. È interessante notare che, GMC (il Mono compilatore C #) ottiene il diritto:

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top