4 ms·
For the record (sorry), I believe C# uses the clone operation because records support inheritance. For me, this is where lies the design flaw, trying to suppor
by _old_dude_ 1y ago
For the record (sorry), I believe C# uses the clone operation because records support inheritance.
For me, this is where lies the design flaw, trying to support both inheritance and be immutability at the same time.
- hvb2 1y agoIt was never immutable? You can have collections on there that are perfectly mutable as well as being able to set values? You CAN use the with keyword, but that's a choice. I've seen people use records for value based equality and to use for things like dictionary keys. Immutability in c# just doesn't exist, any attempt to achieve it is flawed from the start
- louthy 1y agoCloning anything creates a new object of a known type (well, the runtime knows at least) and so if the object re-runs the init-properties of the known type then it will be the same as constructing that type afresh. You could even imagine a compiler generated virtual method: `OnCloneReinitialiseFields()`, or something, that just re-ran the init-property setters (post clone operation). Is there some other inheritance issue that is problematic here? Immutability isn't a concern, it's purely about what happens after cloning an object, whether the fields are immutable or not doesn't change the behaviour of the `with` operation.
- ethan_smith 1y agoThe inheritance + immutability combination forces the compiler to use field-by-field copying rather than constructor chaining, which bypasses the property initialization logic that would maintain consistency between related fields.