Canged CodedInputStream.ReadTag to use boolean result with out params to
support reading a field name rather than a field tag.
diff --git a/src/ProtocolBuffers/UnknownFieldSet.cs b/src/ProtocolBuffers/UnknownFieldSet.cs
index 20a4693..ff6a153 100644
--- a/src/ProtocolBuffers/UnknownFieldSet.cs
+++ b/src/ProtocolBuffers/UnknownFieldSet.cs
@@ -419,13 +419,19 @@
             /// </summary>

             public Builder MergeFrom(CodedInputStream input)

             {

-                while (true)

+                uint tag;

+                string name;

+                while (input.ReadTag(out tag, out name))

                 {

-                    uint tag = input.ReadTag();

-                    if (tag == 0 || !MergeFieldFrom(tag, input))

+                    if (tag == 0)

                     {

+                        if (input.SkipField())

+                            continue; //can't merge unknown without field tag

                         break;

                     }

+

+                    if(!MergeFieldFrom(tag, input))

+                        break;

                 }

                 return this;

             }

@@ -581,11 +587,14 @@
 

             internal void MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry, IBuilder builder)

             {

-                while (true)

+                uint tag;

+                string name;

+                while (input.ReadTag(out tag, out name))

                 {

-                    uint tag = input.ReadTag();

                     if (tag == 0)

                     {

+                        if (input.SkipField())

+                            continue; //can't merge unknown without field tag

                         break;

                     }

 

@@ -765,11 +774,14 @@
                 IBuilderLite subBuilder = null;

                 FieldDescriptor field = null;

 

-                while (true)

+                uint tag;

+                string name;

+                while (input.ReadTag(out tag, out name))

                 {

-                    uint tag = input.ReadTag();

                     if (tag == 0)

                     {

+                        if (input.SkipField())

+                            continue; //can't merge unknown without field tag

                         break;

                     }

 

@@ -833,7 +845,7 @@
                     else

                     {

                         // Unknown tag.  Skip it.

-                        if (!input.SkipField(tag))

+                        if (!input.SkipField())

                         {

                             break; // end of group

                         }