make public API take ReadOnlySpan<byte> without "ref"
diff --git a/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs b/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
index 0e33cc0..95b426d 100644
--- a/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
+++ b/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
@@ -53,8 +53,7 @@
             assert(parsedBuffer);
 
             // Load content as ReadOnlySpan
-            ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
-            parsedBuffer = parser.ParseFrom(ref bytesSpan);
+            parsedBuffer = parser.ParseFrom(new ReadOnlySpan<byte>(bytes));
             assert(parsedBuffer);
         }
 
@@ -72,8 +71,7 @@
             assert(parsedBuffer);
 
             // Load content as ReadOnlySpan
-            ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
-            parsedBuffer = parser.ParseFrom(ref bytesSpan);
+            parsedBuffer = parser.ParseFrom(new ReadOnlySpan<byte>(bytes));
             assert(parsedBuffer);
         }
 
@@ -85,11 +83,7 @@
 
             Assert.Throws<TException>(() => parser.ParseFrom(new ReadOnlySequence<byte>(bytes)));
 
-            Assert.Throws<TException>(() => 
-              {
-                ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
-                parser.ParseFrom(ref bytesSpan);
-              });
+            Assert.Throws<TException>(() => parser.ParseFrom(new ReadOnlySpan<byte>(bytes)));
         }
 
         public static void AssertRoundtrip<T>(MessageParser<T> parser, T message, Action<T> additionalAssert = null) where T : IMessage<T>
@@ -116,8 +110,7 @@
             additionalAssert?.Invoke(parsedBuffer);
 
             // Load content as ReadOnlySpan
-            ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
-            parsedBuffer = parser.ParseFrom(ref bytesSpan);
+            parsedBuffer = parser.ParseFrom(new ReadOnlySpan<byte>(bytes));
             Assert.AreEqual(message, parsedBuffer);
             additionalAssert?.Invoke(parsedBuffer);
         }
diff --git a/csharp/src/Google.Protobuf/MessageExtensions.cs b/csharp/src/Google.Protobuf/MessageExtensions.cs
index 1c0c437..d43177c 100644
--- a/csharp/src/Google.Protobuf/MessageExtensions.cs
+++ b/csharp/src/Google.Protobuf/MessageExtensions.cs
@@ -85,7 +85,7 @@
         /// <param name="message">The message to merge the data into.</param>
         /// <param name="span">Span containing the data to merge, which must be protobuf-encoded binary data.</param>
         [SecuritySafeCritical]
-        public static void MergeFrom(this IMessage message, ref ReadOnlySpan<byte> span) =>
+        public static void MergeFrom(this IMessage message, ReadOnlySpan<byte> span) =>
             MergeFrom(message, ref span, false, null);
 
         /// <summary>
diff --git a/csharp/src/Google.Protobuf/MessageParser.cs b/csharp/src/Google.Protobuf/MessageParser.cs
index 824d1afc..74ef503 100644
--- a/csharp/src/Google.Protobuf/MessageParser.cs
+++ b/csharp/src/Google.Protobuf/MessageParser.cs
@@ -134,7 +134,7 @@
         /// <param name="data">The data to parse.</param>
         /// <returns>The parsed message.</returns>
         [SecuritySafeCritical]
-        public IMessage ParseFrom(ref ReadOnlySpan<byte> data)
+        public IMessage ParseFrom(ReadOnlySpan<byte> data)
         {
             IMessage message = factory();
             message.MergeFrom(ref data, DiscardUnknownFields, Extensions);
@@ -334,7 +334,7 @@
         /// <param name="data">The data to parse.</param>
         /// <returns>The parsed message.</returns>
         [SecuritySafeCritical]
-        public new T ParseFrom(ref ReadOnlySpan<byte> data)
+        public new T ParseFrom(ReadOnlySpan<byte> data)
         {
             T message = factory();
             message.MergeFrom(ref data, DiscardUnknownFields, Extensions);