public int A { get; private set; }
public Test(int A, int B) {
public Test(Test original, int B) : this(original.A, B) {}
return (Test)this.MemberwiseClone();
public Test Clone(int A) {
public Test CloneB(int B) {
return new Test(this.A, B);
private static T Resolve<T>(T originalValue, T newValue) => newValue == default ? originalValue : newValue;
public Test(Test original, int A = default, int B = default) : this(Resolve(original.A, A), Resolve(original.B, B)) {}
private static T ResolveV2<T>(T originalValue, T newValue, bool force) => newValue == default && !force ? originalValue : newValue;
public Test(Test original, int A = default, bool forceA = false, int B = default, bool forceB = false) : this(ResolveV2(original.A, A, forceA), ResolveV2(original.B, B, forceB)) {}
public override string ToString() {
public static void Main()
var test = new Test(1,2);
Console.WriteLine($"Original {test}\n");
var overridePrivate = test.Clone(A: 66);
Console.WriteLine($"Private prop overriden {overridePrivate}");
Console.WriteLine($"Original did not change {test}\n");
var overrideReadOnly = new Test(test, B: 66);
Console.WriteLine($"ReadOnly prop overriden {overrideReadOnly}");
Console.WriteLine($"Original did not change {test}\n");