2013-01-22 14 views
5

Niedawno miałem definicję klasy WinRT z metod, takich jak ten:Dlaczego w WinRT jest wymagany DefaultOverloadAttribute?

public void Foo(string x){} 
public void Foo(CustomClass x){} 

Kompilator wyrzucił błąd mimo że

Do przeciążenia 1-parametr z Earlz.FooBar musi mieć dokładnie jeden sposób określony jako domyślne przeciążenie poprzez dekorowanie go za pomocą Windows.Foundation.Metadata.DefaultOverloadAttribute.

Jakie implikacje ma ten atrybut? Nie wiem, jak działają prognozy WinRT, ale to, co piszę, stanie się ostatecznie użytecznym API. Dlatego chcę się upewnić, że nie robię czegoś, co spowoduje ból dla osób korzystających z interfejsu API. Czy powinienem zmienić nazwę mojego Foo metody na FooCustom lub niektóre takie, lub używa DefaultOverload na bardziej powszechnie używanej funkcji do zrobienia?

Również próbowałem patrząc co robi ten atrybut i dlaczego nie jest to wymagane, ale MSDN było mało szczegółów jak zwykle i po prostu dał jeden opis zdanie „wskazuje, że metoda jest domyślna metoda przeciążenie”

Zakładam główną przyczyną tego atrybutu jest to, że JavaScript obsługuje tylko przeciążanie na liczniku parametrów, a nie na typie parametru. Jak jednak aplikacja JavaScript uzyska dostęp do innych niż domyślne metod WinRT z przeciążeniami typów?

+0

Nie ma żadnych konsekwencji. Microsoft zdecydował się wymagać od programistów zdefiniowania domyślnego przeciążenia dla metod. –

+0

@Ramhound, ale jak to będzie działać, jeśli język nie obsługuje przeciążania? – Earlz

+2

@Ramhound Na przykład w JavaScript nie będzie mógł się dowiedzieć, które próbę przeciążenia próbowano wywołać, ponieważ określa tylko przeciążenia na numerze parametru, a nie na typie parametru (ze względu na dynamikę) – Earlz

Odpowiedz

4

Jak Jesse Jiang opisane w this thread:

JavaScript ma ograniczoną zdolność do różnicowania metod przeciążonych. Dlatego musisz zmienić nazwę funkcji lub ustawić Windows :: Foundation :: Metadata :: DefaultOverloadAttribute, aby ustawić domyślną funkcję przeciążania.

Powiązane problemy