2014-05-16 12 views
6

Ho la seguente classe di base astratta:C# params sulla firma del metodo non si rompe un override/implementazione

public abstract class HashBase 
{ 
    public abstract byte[] Hash(byte[] value); 
} 

E poi vado avanti e attuare tale classe:

public class CRC32Hash : HashBase 
{ 
    public override byte[] Hash(params byte[] value) 
    { 
     return SomeRandomHashCalculator.Hash(value); 
    } 
} 

Compile. ..e funziona!

  1. Si consiglia o conduce a codice "malvagio"?
  2. È "params" una sorta di zucchero sintattico?
+6

* "È" param "una sorta di zucchero sintattico?" * Sì! Se si passa un array, utilizzerà tale array; se passi alcune cose che potrebbero essere elementi di un array, le renderà in un array. Quindi è compatibile; Non so se è consigliato. – Ryan

risposta

1

Si può dare un'occhiata a C# specifica del linguaggio §7.5.3 (sovraccarico)

In breve, penso di override parola chiave viene utilizzata per ridefinire un implementazione, non i parametri. Non puoi sovrascrivere args, gli argomenti devono essere gli stessi dell'astrazione (sto pensando all'applicazione del principio di sostituzione di liskov qui).

Params è totalmente zucchero sintattico, è strettamente equivalente a un semplice array. È solo più facile chiamare in certi casi, evitando il cast di schiere; il compilatore fa il lavoro per te durante la chiamata al metodo.

Nota che in C# 6, params sarà compatibile con IEnumerable.

Problemi correlati