2010-03-12 11 views
22

Zastanawiam się, czy ktoś wie, dlaczego nie wolno używać interfejsów z niejawnymi lub jawnymi operatorami?Dlaczego nie mogę korzystać z interfejsu z operatorem jawnym?

E.g. to podnosi błąd czasu kompilacji:

public static explicit operator MyPlayer(IPlayer player) 
{ 
... 
} 

„konwersje zdefiniowane przez użytkownika lub z interfejsu nie są dozwolone”

Dzięki,

+0

Najprostszym rozwiązaniem jest, dobrze, po prostu zaimplementować interfejs dla betonu klasy :) Zobacz także http://stackoverflow.com/questions/308986/user-defined-conversion-to-interface – nawfal

+0

zacznijmy że ani "public" ani "static" nie są dozwolone w definicjach członków interfejsu .. – quetzalcoatl

Odpowiedz

30

Section 10.9.3 of the C# spec czary to. Krótka wersja jest taka, że ​​jest zabroniona, aby użytkownik mógł być pewny, że konwersje między typami odniesienia i interfejsami odniosą sukces wtedy i tylko wtedy, gdy typ odwołania faktycznie implementuje ten interfejs, oraz że gdy ta konwersja ma miejsce, to ten sam obiekt jest w rzeczywistości odwoływany.

Określenie niejawnej lub jawnej konwersji między typami odniesienia daje użytkownikowi oczekiwanie, że nastąpi zmiana odniesienia; w końcu to samo odniesienie nie może być obu typów. Z drugiej strony użytkownik ma takie same oczekiwania w przypadku konwersji między typami referencji i typami interfejsów.

User-defined conversions are not allowed to convert from or to interface-types. In particular, this restriction ensures that no user-defined transformations occur when converting to an interface-type, and that a conversion to an interface-type succeeds only if the object being converted actually implements the specified interface-type.

+0

dzięki, to wyjaśnia! – theburningmonk

+0

"Określenie niejawnej lub jawnej konwersji między typami odniesienia daje użytkownikowi oczekiwanie, że nastąpi zmiana w referencji" świetne wyjaśnienie! – jorgebg

+0

To wyjaśnia, dlaczego zespół ds. Projektowania języków zapobiegał niejawnym konwersjom _ do_ typów interfejsu. Czy wiesz, dlaczego postanowili dodatkowo ograniczyć liczbę typów konwersacji _ofrom_? Czy chodziło tylko o symetrię? –

Powiązane problemy