How can we help you today? How can we help you today?

10.3 crashes when reflecting embedded methods

Trying to reflect the Main method crashes Reflector 10.3 without comment
internal static class NinetyNineBottlesOfBeer
{
    private static void Main()
    {
        foreach (var line in GetSongText())
            System.Console.WriteLine(line);

        System.Console.ReadLine();

        System.Collections.Generic.IEnumerable<string> GetSongText()
        {
            var numberOfBottles = 99;

            do
            {
                var oldNumberText = GetNumberText(numberOfBottles);

                if (numberOfBottles > 1)
                {
                    yield return $"{oldNumberText} bottles of beer on the wall,";
                    yield return $"{oldNumberText} bottles of beer.";
                    yield return "Take one down, pass it around,";

                    numberOfBottles--;

                    var newNumberText = GetNumberText(numberOfBottles);

                    if (numberOfBottles > 1)
                        yield return $"{newNumberText} bottles of beer on the wall.";
                    else
                        yield return $"{newNumberText} last bottle of beer on the wall.";
                }
                else
                {
                    yield return $"{oldNumberText} last bottle of beer on the wall,";
                    yield return $"{oldNumberText} last bottle of beer.";
                    yield return "Take it down, pass it around,";
                    yield return "No more bottles of beer on the wall.";

                    numberOfBottles--;
                }

                yield return string.Empty;
            } while (numberOfBottles > 0);

            string GetNumberText(int number)
            {
                switch (number / 10)
                {
                    case 9:
                        return GetComboNumberText("Ninety", GetLastDigitText(number - 90));
                    case 8:
                        return GetComboNumberText("Eighty", GetLastDigitText(number - 80));
                    case 7:
                        return GetComboNumberText("Seventy", GetLastDigitText(number - 70));
                    case 6:
                        return GetComboNumberText("Sixty", GetLastDigitText(number - 60));
                    case 5:
                        return GetComboNumberText("Fifty", GetLastDigitText(number - 50));
                    case 4:
                        return GetComboNumberText("Fourty", GetLastDigitText(number - 40));
                    case 3:
                        return GetComboNumberText("Thirty", GetLastDigitText(number - 30));
                    case 2:
                        return GetComboNumberText("Twenty", GetLastDigitText(number - 20));
                    case 1:
                        return GetTeenNumberText(number);
                    case 0:
                        return GetLastDigitText(number);
                    default:
                        throw new System.NotSupportedException();
                }

                string GetComboNumberText(string tens, string ones) => ones != null ? $"{tens}-{ones}" : tens;

                string GetTeenNumberText(int teenNumber)
                {
                    switch (teenNumber)
                    {
                        case 19:
                            return "Nineteen";
                        case 18:
                            return "Eighteen";
                        case 17:
                            return "Seventeen";
                        case 16:
                            return "Sixteen";
                        case 15:
                            return "Fifteen";
                        case 14:
                            return "Fourteen";
                        case 13:
                            return "Thirteen";
                        case 12:
                            return "Twelve";
                        case 11:
                            return "Eleven";
                        case 10:
                            return "Ten";
                        default:
                            throw new System.NotSupportedException();
                    }
                }

                string GetLastDigitText(int lastDigit)
                {
                    switch (lastDigit)
                    {
                        case 9:
                            return "Nine";
                        case 8:
                            return "Eight";
                        case 7:
                            return "Seven";
                        case 6:
                            return "Six";
                        case 5:
                            return "Five";
                        case 4:
                            return "Four";
                        case 3:
                            return "Three";
                        case 2:
                            return "Two";
                        case 1:
                            return "One";
                        case 0:
                            return null;
                        default:
                            throw new System.NotSupportedException();
                    }
                }
            }
        }
    }
}

DJ Doena
0

Comments

1 comment

  • Robyn
    Hi, 

    Thank you for your post!

    This error has been reproduced and a bug logged for it. At the moment we are unable to provide an ETA on the fix. Until then, I recommend switching the optimization level to C# 6 as a workaround:


    Robyn
    0

Add comment

Please sign in to leave a comment.