C# – tipi statici non possono essere utilizzati come argomenti di tipo

Ho una classe generica, che mi aiuta a fare controlli sui valori dell’argomento

internal sealed class Argument<T>
    where T : class
{
    private void TraceAndThrow(Exception ex)
    {
        new InternalTraceHelper<T>().WriteError(ex);
        throw ex;
    }

    internal void ThrowNull(object value, string argName)
    {
        if (ReferenceEquals(value, null))
        {
            TraceAndThrow(new ArgumentNullException(argName));
        }
    }

    internal void ThrowIf(bool condition, string argName)
    {
        if (condition)
        {
            TraceAndThrow(new ArgumentException(null, argName));
        }
    }


    internal void ThrowNotInEnum(Type enumType, object value)
    {
        if (!Enum.IsDefined(enumType, value))
        {
            TraceAndThrow(new ArgumentOutOfRangeException(Resources.ArgEnumIllegalVal.InvariantFormat(value)));
        }
    }
}

Ma quando cerco di usarlo con una classe statica :

internal static class Class1
{
    private static Argument<Class1> _arg;
}

Ho ottenuto questo errore (in fase di compilazione):

tipi statici non possono essere utilizzati come argomenti di tipo

Cosa sto facendo di sbagliato?

InformationsquelleAutor Arnaud F. | 2011-05-02



5 Replies
  1. 31

    Questo è intenzionale.

    Le classi statiche cercare di evitare un uso inappropriato, così in quasi tutte le situazioni, non è possibile utilizzarli in situazioni in cui normalmente si desidera un istanza del tipo… e che include il tipo di argomenti.

    Vedere la sezione 10.1.1.3.1 del C# 4 spec per l’insieme molto limitato di situazioni in cui si può fare riferimento alla classe statica tipi.

    • Facendo mie le classi statiche non statico, ma con un costruttore privato farà il lavoro? Così nessuno può instanciate, ma non è statica. Questo è un buon modo per eseguire esso? (Grazie anche per la sezione l’ho letto)
    • F.: Beh, sarebbe lavoro – ma che cosa si sta utilizzando il tipo di argomento? Che cosa è il punto? Sembra che venga utilizzato solo da InternalTraceHelper, e non sappiamo che.
    • InternalTraceHelper non Trace.Write(), il tipo di argomento è utilizzato per definire la categoria di traccia. Può essere sostituito da Trace.WriteLine("a message", typeof(T).FullName); // Where T = Class1
    • F.: suona come voi forse desidera un non-versione generica di InternalTraceHelper, che prende un Type invece. In realtà, si potrebbe fare tutta la classe non generico, solo con un metodo generico per rendere la creazione di più semplice: InternalTraceHelper.Create<Foo> sarebbe chiamata new InternalTraceHelper(typeof(T)) dove T è il tipo di parametro per il metodo.
    • Grazie mille per il suggerimento Master !
    • Stavo cercando di fare un gestore di eventi per una classe statica per qualche motivo! Buon Microsoft per ridurre il programmatore di errori.

  2. 5

    Generici funzionano solo con le istanze, non le classi statiche.

    • C’è una soluzione? Come posso gestirlo? Non vorrei controllare “manualmente” in classi statiche e utilizzando Argument<T> non statico…
    • No, non c’è altro che utilizzare System.Type.
    • non è possibile passare statico tipi di argomenti, in modo da non vedere quando si sarebbe mai voglia di avere un Argument<StaticType>, se non mi inganno per il nome della classe.
    • Facendo mie le classi statiche non statico, ma con un costruttore privato farà il lavoro? Così nessuno può instanciate, ma non è statica. Questo è un buon modo per eseguire esso?
    • sì, questo è sicuramente un’informativa risposta. perché ha fatto la u la briga di scrivere un testo lungo ?
  3. 2

    Dal momento che le classi statiche non può essere istanziata, non potrà mai creare Argument<T> con un tipo statico.

    • Che non è corretto. ILogger<T> è un esempio in cui la classe diventa una categoria per il logger da utilizzare quando si emette la diagnosi. Questa è una stupida regola.
  4. 0

    Ciò che si sta facendo qualcosa di sbagliato è che utilizza un tipo statico, come un argomento di tipo generico.

Lascia un commento