2011-11-08 12 views

risposta

3

I valori dei parametri predefiniti non sono possibili con valori di riferimento complessi. Il primo funziona perché i parametri sono primitivi che vengono memorizzati nello stack e copiati per il valore . Le matrici sono valori di riferimento complessi, quindi devono essere allocate prima di poter essere visualizzate come parametri.

Edit:
commento di @Henk Holterman è preso bene. Non ho una conoscenza diretta se lo stack o l'heap entrano in gioco in questo modo, quindi questa informazione è errata o fuorviante. Il criterio principale di cui sono a conoscenza è che è possibile utilizzare solo primitives types. Da this document,

Un valore predefinito deve essere uno dei seguenti tipi di espressioni:

  1. un'espressione costante;

  2. un'espressione del nuovo modulo ValType(), in cui ValType è un valore di tipo , ad esempio un enum o una struttura;

  3. un'espressione di default del modulo (ValType), dove ValType è un valore di tipo .

Il "primitive" lista link qui sopra è stato modificato per il 2010 di essere chiamati tipi "built-in". Può essere found here.

+0

stringhe sono anche riferimento tipi e possono essere utilizzate come predefinite bene. E lo stack in realtà non ha un ruolo qui. –

+0

@HenkHolterman: abbastanza giusto. Questo è stato supplementare a una conversazione che ho avuto con qualcuno e non ho trovato nulla che lo confermasse (più ciò che dici è ragionevole). L'ho colpito e ho fornito dei collegamenti per supportare la mia affermazione che i parametri devono essere primitivi (o come ora vengono chiamati nel 2010 - tipi built-in). –

3

Un valore di parametro predefinito deve essere una costante di tempo di compilazione, quindi non è possibile farlo.

2

Non è possibile utilizzare gli inizializzatori come predefiniti.

Si potrebbe utilizzare:

private static void diagonalFill(int[,] a, 
     int[] fillType = null, 
     int[] diagFill = null) 
{ 
    if (fillType == null) 
    fillType = new int[] {0,-1}; 

    if (diagFill == null) 
    diagFill = new int[] {-1,1}; 

    ... 
} 
+0

questa soluzione ovviamente dipende dal fatto che null non è un'opzione che verrà mai passata come parametro. – AndrewC