2013-02-09 12 views
12

Czy istnieje sposób, aby napisać metodę C# poniżej:Jak ustawić parametr opcjonalny bez kompilacji stałą

public string Download(Encoding contentEncoding = null) { 
    defaultEncoding = contentEncoding ?? Encoding.UTF8; 
    // codes... 
} 

z parametrem domyślnym dodanej więc wygląda to tak:

public string Download(Encoding contentEncoding = Encoding.UTF8) { 
    // codes... 
} 

bez używając stałej czasu kompilacji?

Odpowiedz

15

Krótko mówiąc. Nr

Parametry opcjonalne są wymagane do kompilacji stałych czasowych lub typów wartości.

Od Named and Optional Arguments (C# Programming Guide) na MSDN:

Każdy opcjonalny parametr ma wartość domyślną jako część swojej definicji. Jeśli dla tego parametru nie zostanie wysłany żaden argument, zostanie użyta wartość domyślna. Wartość domyślna musi być jednym z następujących typów wyrażeń:

  • wyrażenie stałe;
  • wyrażenie postaci new ValType(), gdzie ValType jest typem wartości, takim jak wyliczenie lub struct;
  • Wyrażenie formularza default(ValType), gdzie ValType jest typem wartości.

Co wydaje się chce osiągnąć można osiągnąć przeciążenie:

public string Download() 
{ 
    return Download(Encoding.UTF8); 
} 

public string Download(Encoding contentEncoding) 
{ 
    defaultEncoding = contentEncoding ?? Encoding.UTF8; 
    // codes... 
} 

Zauważ, że to nie jest to samo, co opcjonalnych parametrów, jak wartość domyślna dostaje zakodowanego do wywołującego z opcjonalnymi parametrami (dlatego istnieją ograniczenia dla nich).

+1

Dzięki takiemu rozwiązaniu może on nawet chce rzucać 'ArgumentNullException' w drugim przeciążenia podczas' contentEncoding' jest null. –

6

Użyj przeciążenia:

public string Download(Encoding contentEncoding) 
{ 
    // codes... 
} 

public string Download() 
{ 
    return Download(Encoding.UTF8); 
} 
4
public static string Download(Encoding encoder = null) 
{ 
    if (encoder == null) 
     encoder = Encoding.Default 


    string returnVal=""; 
    // do something 

    return returnVal; 
} 
+0

w skrócie. koder == koder? Kodowanie. Domyślnie – BrilBroeder

Powiązane problemy