Question

Is there a way in C# to add implicit conversions to types already defined in other assemblies?

For example, if I am using two different assemblies which each provide their own Vector3 struct, and use it in their APIs, it would be nice to be able to define a conversion once, and then just pass a Foo.Vector3 to a method that expects a Bar.Vector3, and have it automatically converted.

If I had the source for the libraries then I could add implicit conversion operators. Without that source, I am currently doing the conversion explicitly myself with a helper function every time. I'm hoping for a nicer way.

I realize I could create my own Vector3 struct with implicit conversion operators to and from the other two structs, but this wouldn't solve all the cases where I want to directly pass an object of one (externally defined) type to a method expecting the other.

Bonus question: is there anything authors of libraries that expose things like a Vector3 struct in their API should do to facilitate ease of use in this regard?

Was it helpful?

Solution

You can provide implicit conversion to-and-from a third-party type for any type that you author yourself, but you cannot add support for implicit conversion between two third-party types.

You could improve the elegance of converting between the two types somewhat by adding extension methods to both Vector3 types;

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 */
}

That's about the best you can expect to achieve.

OTHER TIPS

Unfortunately you cannot add implicit conversions that convert to and from a type that you cannot change. I would have recommended the workaround you mentioned, but you already mentioned it :).

I’m afraid even the answer to your bonus question is “you can’t”.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top