private ParseResult <LocalDate> DetermineYear(PatternFields usedFields)
            {
                int yearFromEra = 0;

                if (IsFieldUsed(usedFields, PatternFields.YearOfEra))
                {
                    // Odd to have a year-of-era without era, but it's valid...
                    if (!IsFieldUsed(usedFields, PatternFields.Era))
                    {
                        EraIndex = Calendar.Eras.IndexOf(templateValue.Era);
                    }
                    // Find the absolute year from the year-of-era and era
                    if (YearOfEra < Calendar.GetMinYearOfEra(EraIndex) ||
                        YearOfEra > Calendar.GetMaxYearOfEra(EraIndex))
                    {
                        return(ParseResult <LocalDate> .YearOfEraOutOfRange(YearOfEra, EraIndex, Calendar));
                    }
                    yearFromEra = Calendar.GetAbsoluteYear(YearOfEra, EraIndex);
                }

                // Note: we can't have YearTwoDigits without Year, hence there are only 6 options here rather than 8.
                switch (usedFields & (PatternFields.Year | PatternFields.YearOfEra | PatternFields.YearTwoDigits))
                {
                case PatternFields.Year:
                    // Fine, we'll just use the Year value we've been provided
                    break;

                case PatternFields.Year | PatternFields.YearTwoDigits:
                    Year = GetAbsoluteYearFromTwoDigits(templateValue.Year, Year);
                    break;

                case PatternFields.YearOfEra:
                    Year = yearFromEra;
                    break;

                case PatternFields.YearOfEra | PatternFields.Year | PatternFields.YearTwoDigits:
                    // We've been given a year of era, but only a two digit year. The year of era
                    // takes precedence, so we just check that the two digits are correct.
                    // This is a pretty bizarre situation...
                    if ((Math.Abs(yearFromEra) % 100) != Year)
                    {
                        return(ParseResult <LocalDate> .InconsistentValues('y', 'Y'));
                    }
                    Year = yearFromEra;
                    break;

                case PatternFields.YearOfEra | PatternFields.Year:
                    if (Year != yearFromEra)
                    {
                        return(ParseResult <LocalDate> .InconsistentValues('y', 'Y'));
                    }
                    Year = yearFromEra;
                    break;

                case 0:
                    Year = templateValue.Year;
                    break;
                    // No default: it would be impossible.
                }
                if (Year > Calendar.MaxYear || Year < Calendar.MinYear)
                {
                    // The field can't be YearOfEra, as we've already validated that earlier.
                    return(ParseResult <LocalDate> .FieldValueOutOfRange(Year, 'y'));
                }
                return(null);
            }