public static void Main()
TestSimpleChange("Simple Change");
TestRefChange("Value Ref Change");
TestClassChange("Class Change");
private static void TestSimpleChange(string message)
Console.WriteLine($"{message}: i = {i}; j = {j}");
private static void TestRefChange(string message)
Console.WriteLine($"{message}: i = {i}; j = {j}");
private static void TestClassChange(string message)
var i = new DemoClass(42);
var j = i.ChangeClass(new DemoClass(24));
Console.WriteLine($"{message}: i = {i}; j = {j}");
public DemoClass(int _value)
public override string ToString() => _value.ToString("D");
internal static class Extensions
public static T Change<T>(this T obj, T newValue) where T : struct
public static T ChangeRef<T>(this ref T obj, T newValue) where T : struct
public static T ChangeClass<T>(this T obj, T newValue) where T : class