Fluent Builders: The case against implicit conversion
Most people add an implicit conversion to their builder API which gives them the advantage that they don’t have to call Build explicitely. I have decided that i do not want to have this implicit conversion for a couple of reasons:
- C# does not allow to define implicit conversions to or from an interface
- Implicit conversions are not very discoverable
- Implicit conversions can break the API
Here is an example to clarify that last reason: Consider an OrderBuilder which requires the user to provide a product and then a quantity:
interface ITakeProduct { ITakeQuantity WithProduct(int productId); }
interface ITakeQuantity { IBuildProduct WithQuantity(int quantity); }
interface IBuildProduct { Product Build(); }
With the existence of an implicit conversion operator a developer can create an invalid order as following:
Order order = new OrderBuilder();
Conclusion: I am not convinced that Fluent Builders should support implicit conversion.