2011-11-08 17 views

Odpowiedz

3

Domyślne wartości parametrów nie są możliwe w przypadku złożonych wartości referencyjnych. Pierwszy działa, ponieważ parametry są prymitywami , które są przechowywane na stosie i są kopiowane przez wartość . Tablice są złożonymi wartościami referencyjnymi, więc muszą być najpierw przydzielone, zanim pojawią się jako parametry.

Edit:
komentarz @Henk Holterman jest dobrze zrobione. Nie mam bezpośredniej wiedzy na temat tego, czy stos lub sterty wchodzą w grę, więc ta informacja jest błędna lub wprowadzająca w błąd. Podstawowe kryteria, o których mi wiadomo, to to, że można użyć tylko primitives types. Od this document,

Domyślna wartość musi być jednym z następujących rodzajów wyrażeń:

  1. stałym wyrażeniem;

  2. wyrażenie nowej formy ValType(), gdzie ValType jest wartością typu , taką jak wyliczenie lub struct;

  3. wyrażenie domyślne (ValType), gdzie ValType jest wartością typu .

z „prymitywów” link Powyższa lista została zmodyfikowana na 2010 nazywać typy „wbudowane”. Może to być found here.

+0

ciągi są również odwołać typów i mogą być używane jako domyślne dobrze. A stos naprawdę nie odgrywa tutaj żadnej roli. –

+0

@HenkHolterman: Uczciwa. To było uzupełnieniem rozmowy, którą miałem z kimś i nie mogłem znaleźć niczego, co by ją poparło (plus to, co mówisz brzmi rozsądnie). Uderzyłem go i podałem odnośniki do obsługi mojego oświadczenia, że ​​parametry muszą być prymitywne (lub jak są teraz nazywane w 2010 r. - typy wbudowane). –

3

Domyślna wartość parametru musi być stałą czasową kompilacji, więc nie można tego zrobić.

2

Nie można używać inicjalizatorów jako domyślnych.

Można użyć:

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

to rozwiązanie oczywiście zależy od tego, czy null nie jest opcją, która kiedykolwiek zostanie przekazana jako parametr. – AndrewC