private object CreateAndPopulateDictionary(JsonReader reader, JsonDictionaryContract contract, string id)
		{
			object dictionary;

			if (contract.DefaultCreator != null &&
			  (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
				dictionary = contract.DefaultCreator();
			else
				throw new JsonSerializationException("Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType));

			IWrappedDictionary dictionaryWrapper = contract.CreateWrapper(dictionary);

			PopulateDictionary(dictionaryWrapper, reader, contract, id);

			return dictionaryWrapper.UnderlyingDictionary;
		}
    private IDictionary CreateNewDictionary(JsonReader reader, JsonDictionaryContract contract, out bool createdFromNonDefaultConstructor)
    {
      if (contract.IsReadOnlyOrFixedSize)
      {
        createdFromNonDefaultConstructor = true;
        return contract.CreateTemporaryDictionary();
      }
      else if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
      {
        object dictionary = contract.DefaultCreator();

        if (contract.ShouldCreateWrapper)
          dictionary = contract.CreateWrapper(dictionary);

        createdFromNonDefaultConstructor = false;
        return (IDictionary) dictionary;
      }
      else if (contract.ParametrizedConstructor != null)
      {
        createdFromNonDefaultConstructor = true;
        return contract.CreateTemporaryDictionary();
      }
      else
      {
        throw JsonSerializationException.Create(reader, "Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType));
      }
    }