2009-07-16 9 views
29

Chciałbym zdefiniować delegata, który ma kilka dat, nieznaną liczbę innych parametrów (za pomocą słowa kluczowego params), i który zwraca listę obiektów;Czy możesz użyć słowa kluczowego params w delegacie?

Func<DateTime, DateTime, params int[], List<object>> 

Visual Studio nie lubi składni, która sprawia, że ​​myślę, że nie jest to dozwolone. Czy ktoś może mi powiedzieć dlaczego.

Odpowiedz

21

Nie można mieć atrybuty niestandardowe na ogólny typ argumentu (CLI nie zezwala na to) , a kompilator C# implementuje słowo kluczowe params, emitując parametr System.ParamArrayAttribute dla odpowiedniego parametru metody.

Zatrzymuje cię przed użyciem go z System.Func <...> generycznych delegatów, ale zawsze można stworzyć swój własny typ delegata, który ma korzystać params.

42

Nie możesz używać parametrów dla żadnego parametru innego niż ostatni ... to część tego, na co narzeka.

Nie można również użyć params w argumencie typu. Dotyczy to nie tylko delegatów, ale ogólnie. Na przykład, nie można napisać:

List<params string[]> list = new List<params string[]>(); 

Można jednak zadeklarować nowy typ delegowana tak:

delegate void Foo(int x, params string[] y); 

... 

Foo foo = SomeMethod(); 
foo(10, "Hi", "There"); 

Należy zauważyć, że metoda konwersji grupa będzie musiała dopasowywania metoda, która bierze tablicę ciągów - nie można zadeklarować SomeMethod jak:

void SomeMethod(int x, string a, string b) 

i oczekują powyższego do pracy, na przykład. Musiałby to być:

void SomeMethod(int x, string[] args) 

(. Albo może korzystać params się, oczywiście)

Powiązane problemy