internal static T Read <T>(CodedInputStream input, FieldCodec <T> codec) { int length = input.ReadLength(); int oldLimit = input.PushLimit(length); uint tag; T value = codec.DefaultValue; while (input.ReadTag(out tag)) { if (tag == 0) { throw InvalidProtocolBufferException.InvalidTag(); } if (tag == codec.Tag) { value = codec.Read(input); } if (WireFormat.IsEndGroupTag(tag)) { break; } } input.CheckLastTagWas(0); input.PopLimit(oldLimit); return(value); }