C # добавление имплицитных преобразований в существующие типы - PullRequest
8 голосов
/ 21 января 2011

Есть ли способ в C # добавить неявные преобразования в типы, уже определенные в других сборках?

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

Если бы у меня был источник для библиотек, я мог бы добавить операторы неявного преобразования. Без этого источника в настоящее время я сам выполняю преобразование с помощью вспомогательной функции каждый раз. Я надеюсь на более хороший путь.

Я понимаю, что могу создать свой собственный Vector3 struct с неявными операторами преобразования в и из двух других структур, но это не решит все случаи, когда я хочу напрямую передать объект одного (внешне определенный) тип метода, ожидающего другого.

Бонусный вопрос : есть ли что-нибудь, что авторы библиотек, которые представляют такие вещи, как структура Vector3, в своих API, должны сделать для облегчения использования в этом отношении?

Ответы [ 2 ]

10 голосов
/ 21 января 2011

Вы можете предоставить неявное преобразование в и из стороннего типа для любого типа, который вы создаете сами, но вы не можете добавить поддержку неявного преобразования между двумя сторонними типами.

Вы можете улучшитьэлегантность преобразования между двумя типами за счет добавления методов расширения к обоим типам 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 */
}

Это лучшее из того, что вы можете ожидать.

2 голосов
/ 21 января 2011

К сожалению, вы не можете добавить неявные преобразования, которые преобразуются в и из типа, который вы не можете изменить.Я бы порекомендовал обходной путь, о котором вы упомянули, но вы уже упомянули его:).

Боюсь, что даже ответ на ваш бонусный вопрос «вы не можете».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...