Include the size of values (and tags) for extensions, even if the value is the default

Fixes #8218.
diff --git a/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs b/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
index aceb4a6..951e856 100644
--- a/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
+++ b/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
@@ -116,7 +116,22 @@
             var other = message.Clone();

 

             Assert.AreEqual(message, other);

-            Assert.AreEqual(message.CalculateSize(), message.CalculateSize());

+            Assert.AreEqual(message.CalculateSize(), other.CalculateSize());

+        }

+

+        [Test]

+        public void TestDefaultValueRoundTrip()

+        {

+            var message = new TestAllExtensions();

+            message.SetExtension(OptionalBoolExtension, false);

+            Assert.IsFalse(message.GetExtension(OptionalBoolExtension));

+            Assert.IsTrue(message.HasExtension(OptionalBoolExtension));

+

+            var bytes = message.ToByteArray();

+            var registry = new ExtensionRegistry { OptionalBoolExtension };

+            var parsed = TestAllExtensions.Parser.WithExtensionRegistry(registry).ParseFrom(bytes);

+            Assert.IsFalse(parsed.GetExtension(OptionalBoolExtension));

+            Assert.IsTrue(parsed.HasExtension(OptionalBoolExtension));

         }

     }

 }