|  | @@ -17,6 +17,8 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |    /// FieldSet class, FieldSet just has a MakeImmutable() method. This is safe so long as
 | 
	
		
			
				|  |  |    /// all callers are careful not to let a mutable FieldSet escape into the open. This would
 | 
	
		
			
				|  |  |    /// be impossible to guarantee if this were a public class, of course.
 | 
	
		
			
				|  |  | +  /// 
 | 
	
		
			
				|  |  | +  /// All repeated fields are stored as IList[object] even 
 | 
	
		
			
				|  |  |    /// </summary>
 | 
	
		
			
				|  |  |    internal class FieldSet {
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -131,7 +133,7 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |        int fieldNumber = WireFormat.GetTagFieldNumber(tag);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        FieldDescriptor field;
 | 
	
		
			
				|  |  | -      IMessage defaultInstance = null;
 | 
	
		
			
				|  |  | +      IMessage defaultFieldInstance = null;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (type.IsExtensionNumber(fieldNumber)) {
 | 
	
		
			
				|  |  |          ExtensionInfo extension = extensionRegistry[type, fieldNumber];
 | 
	
	
		
			
				|  | @@ -139,7 +141,7 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |            field = null;
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            field = extension.Descriptor;
 | 
	
		
			
				|  |  | -          defaultInstance = extension.DefaultInstance;
 | 
	
		
			
				|  |  | +          defaultFieldInstance = extension.DefaultInstance;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          field = type.FindFieldByNumber(fieldNumber);
 | 
	
	
		
			
				|  | @@ -155,8 +157,8 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |          case FieldType.Group:
 | 
	
		
			
				|  |  |          case FieldType.Message: {
 | 
	
		
			
				|  |  |              IBuilder subBuilder;
 | 
	
		
			
				|  |  | -            if (defaultInstance != null) {
 | 
	
		
			
				|  |  | -              subBuilder = defaultInstance.CreateBuilderForType();
 | 
	
		
			
				|  |  | +            if (defaultFieldInstance != null) {
 | 
	
		
			
				|  |  | +              subBuilder = defaultFieldInstance.CreateBuilderForType();
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                subBuilder = builder.CreateBuilderForField(field);
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -308,7 +310,8 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |      /// <list>
 | 
	
		
			
				|  |  |      /// <item>For singular message values, null is returned.</item>
 | 
	
		
			
				|  |  |      /// <item>For singular non-message values, the default value of the field is returned.</item>
 | 
	
		
			
				|  |  | -    /// <item>For repeated values, an empty immutable list is returned.</item>
 | 
	
		
			
				|  |  | +    /// <item>For repeated values, an empty immutable list is returned. This will be compatible
 | 
	
		
			
				|  |  | +    /// with IList[object], regardless of the type of the repeated item.</item>
 | 
	
		
			
				|  |  |      /// </list>
 | 
	
		
			
				|  |  |      /// This method returns null if the field is a singular message type
 | 
	
		
			
				|  |  |      /// and is not set; in this case it is up to the caller to fetch the 
 | 
	
	
		
			
				|  | @@ -361,7 +364,7 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |            throw new ArgumentException("Indexer specifying field and index can only be called on repeated fields.");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        return ((List<object>)this[field])[index];
 | 
	
		
			
				|  |  | +        return ((IList<object>) this[field])[index];
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        set {
 | 
	
		
			
				|  |  |          if (!field.IsRepeated) {
 | 
	
	
		
			
				|  | @@ -372,15 +375,13 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |          if (!fields.TryGetValue(field, out list)) {
 | 
	
		
			
				|  |  |            throw new ArgumentOutOfRangeException();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        ((List<object>) list)[index] = value;
 | 
	
		
			
				|  |  | +        ((IList<object>) list)[index] = value;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /// <summary>
 | 
	
		
			
				|  |  |      /// See <see cref="IBuilder.AddRepeatedField" />
 | 
	
		
			
				|  |  |      /// </summary>
 | 
	
		
			
				|  |  | -    /// <param name="field"></param>
 | 
	
		
			
				|  |  | -    /// <param name="value"></param>
 | 
	
		
			
				|  |  |      internal void AddRepeatedField(FieldDescriptor field, object value) {
 | 
	
		
			
				|  |  |        if (!field.IsRepeated) {
 | 
	
		
			
				|  |  |          throw new ArgumentException("AddRepeatedField can only be called on repeated fields.");
 | 
	
	
		
			
				|  | @@ -391,7 +392,7 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |          list = new List<object>();
 | 
	
		
			
				|  |  |          fields[field] = list;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -      ((List<object>) list).Add(value);
 | 
	
		
			
				|  |  | +      ((IList<object>) list).Add(value);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /// <summary>
 | 
	
	
		
			
				|  | @@ -454,7 +455,7 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |          throw new ArgumentException("GetRepeatedFieldCount() can only be called on repeated fields.");
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      return ((List<object>) this[field]).Count;
 | 
	
		
			
				|  |  | +      return ((IList<object>) this[field]).Count;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /// <summary>
 | 
	
	
		
			
				|  | @@ -480,8 +481,8 @@ namespace Google.ProtocolBuffers {
 | 
	
		
			
				|  |  |              existingValue = new List<object>();
 | 
	
		
			
				|  |  |              fields[field] = existingValue;
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | -          List<object> list = (List<object>)existingValue;
 | 
	
		
			
				|  |  | -          foreach (object otherValue in (IEnumerable)entry.Value) {
 | 
	
		
			
				|  |  | +          IList<object> list = (IList<object>) existingValue;
 | 
	
		
			
				|  |  | +          foreach (object otherValue in (IEnumerable) entry.Value) {
 | 
	
		
			
				|  |  |              list.Add(otherValue);
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          } else if (field.MappedType == MappedType.Message && existingValue != null) {
 |