C# добавя косвени преобразувания към съществуващи типове

Има ли начин в C# да се добавят имплицитни преобразувания към типове, които вече са дефинирани в други сборки?

Например, ако използвам две различни сглобки, всяка от които предоставя свой собствен Vector3 struct и го използвам в своите API, би било хубаво да мога да дефинирам преобразуване веднъж и след това просто да предам Foo.Vector3 на метод, който очаква Bar.Vector3 , и го преобразувайте автоматично.

Ако имах източника за библиотеките, тогава бих могъл да добавя имплицитни оператори за преобразуване. Без този източник в момента правя преобразуването изрично сам с помощна функция всеки път. Надявам се на по-хубав начин.

Осъзнавам, че мога да създам свой собствен Vector3 struct с имплицитни оператори за преобразуване към и от другите две структури, но това няма да разреши всички случаи, в които искам директно да предам обект на един (външно дефиниран) тип към метод, очакващ другия.

Допълнителен въпрос: има ли нещо, което авторите на библиотеки, които излагат неща като Vector3 структура в своя API, трябва да направят, за да улеснят използването в това отношение?


person Ergwun    schedule 21.01.2011    source източник
comment
оператори за разширение.. Обичам го :)   -  person nawfal    schedule 06.06.2013


Отговори (2)


Можете да предоставите имплицитно преобразуване към и от тип на трета страна за всеки тип, който сте автор сами, но не можете да добавите поддръжка за имплицитно преобразуване между два типа на трети страни.

Бихте могли донякъде да подобрите елегантността на конвертирането между двата типа, като добавите методи за разширение и към двата типа Vector3;

public static Bar.Vector3 ToBarVector3(this Foo.Vector3 foo) {
    return /* instance of Bar.Vector3 */
}

public static Foo.Vector3 ToFooVector3(this Bar.Vector3 bar) {
    return /* instance of Foo.Vector3 */
}

Това е най-доброто, което можете да очаквате да постигнете.

person Bradley Smith    schedule 21.01.2011

За съжаление не можете да добавяте неявни преобразувания, които преобразуват към и от тип, който не можете да промените. Бих препоръчал заобиколното решение, което споменахте, но вече го споменахте :).

Опасявам се, че дори отговорът на вашия бонус въпрос е „не можете“.

person Timwi    schedule 21.01.2011