2013-06-17 8 views
9

Jakie są reguły przy rozwiązywaniu zmiennej liczby parametrów przekazywanych przez params?Rozwiązywanie problemów w języku C#

Załóżmy, że mam kod:

public void Method(params object[] objects) { } 

public void Method(IMyInterface intf, params object[] objects) { } 

Jak Method(a, b, c) rozwiązany, jeśli jest IMyInterface? Czy mogę być pewny, że C# będzie zawsze próbował wybrać najbardziej pasujące przeciążenie?

+0

starannością uwag na temat downvote? – Spook

Odpowiedz

11

to zostanie odebrane przez specyfikację języka C#:

7.5.3.1 Dotyczy członek funkcja

[...]

  • W przeciwnym razie, jeśli ma zastosowanie w MP jego normalna forma i MQ ma tablicę parametrów i ma zastosowanie tylko w jej rozszerzonej formie, a następnie MP jest o lepszy niż MQ.

  • W przeciwnym razie, jeśli MP ma więcej zadeklarowanych parametrów niż MQ, wówczas MP jest o lepszy niż MQ. Może się to zdarzyć, jeśli obie metody mają tablice params i mają zastosowanie tylko w ich rozwiniętych formach.

[...]

W przykładzie oba przeciążenia byłoby zastosowanie tylko w swoich rozbudowanych formach. Ponieważ drugi ma bardziej zadeklarowane parametry, będzie lepiej .

W kontekście specyfikacji, jeden przeciążenie jest lepiej niż wszystkich innych oznacza, że ​​kompilator wybiera go związać połączenia, jak by się stało na przykład w ramach dyskusji (jeśli nikt przeciążenie jest lepszy niż wszystkie inne, wynikiem jest błąd podczas kompilacji z powodu niejednoznaczności).

+0

Czym jest rozszerzona forma parametrów metody? –

+0

@gmailuser: W terminologii laika używasz "rozszerzonej formy", jeśli usunięcie 'params' z definicji metody spowodowałoby, że wywołanie metody nie zostanie skompilowane. Biorąc pierwsze przeciążenie, 'Method (new object [] {" foo "})' jest normalną formą, ponieważ formalnym argumentem jest 'object []' i to właśnie przekazujecie. 'Metoda (" foo ")' jest rozszerzoną formą, ponieważ polegasz na kompilatorze, aby utworzyć 'object []' dla ciebie i nie byłoby to możliwe bez 'params'. – Jon

3

Patrz również C# Spec. 17.5.1.4 regarding Parameter arrays

Podczas wykonywania rozdzielczość przeciążeniem, metodę z parametrem Tablica mogą być stosowane albo w ich normalnej postaci albo w postaci rozszerzonej (§14.4.2.1). 2 Rozszerzona forma metody jest dostępna tylko wtedy, gdy normalna forma metody nie jest dostępna i tylko wtedy, gdy metoda z tą samą sygnaturą, co rozszerzony formularz, nie jest już zadeklarowana w tym samym typie .

Przykład

using System; 
class Test 
{ 
    static void F(params object[] a) { 
     Console.WriteLine("F(object[])"); 
    } 
    static void F() { 
     Console.WriteLine("F()"); 
    } 
    static void F(object a0, object a1) { 
     Console.WriteLine("F(object,object)"); 
    } 
    static void Main() { 
     F(); 
     F(1); 
     F(1, 2); 
     F(1, 2, 3); 
     F(1, 2, 3, 4); 
    } 
} 

produkuje wyjście:

F(); 
F(object[]); 
F(object,object); 
F(object[]); 
F(object[]);