«CLR обнаружила недопустимую программу» при использовании Enumerable.ToDictionary с расширением method

Коллега передал мне интересный образец кода, который дает сбой InvalidProgramException («CLR обнаружила недопустимую программу») при запуске.

Проблема, по-видимому, возникает во время JIT, поскольку он компилируется нормально, но выдает исключение непосредственно перед вызовом метода со строкой «оскорбление» - я думаю, поскольку он выполняется JIT.

Данная строка вызывает Enumerable.ToDictionary и передает Func в качестве второго аргумента.

Если аргумент Func полностью задан с помощью лямбды, он работает; если он указан как группа методов, в случае неудачи. Конечно, эти два эквивалента?

Это поставило меня в тупик (и коллегу, который это обнаружил!) - и это определенно похоже на ошибку JIT.

[РЕДАКТИРОВАТЬ: Извините - я получил случаи прохождения и отказа неверно в примере кода - теперь исправлено (описание выше было правильным)]

Есть ли у кого-нибудь объяснение ?

using System;
using System.Linq;

internal class Program
{
    private static void Main(string[] args)
    {
        Test.Try();
    }
}

public class Test
{
    public static readonly int[] integers = new[] { 1, 3, 5 };
    public static void Try()
    {
        var line = new Line { A = 3, B = 5 };

        // PASSES
        var dict = integers.ToDictionary<int, int, decimal>(i => i, i => line.Compute(i));

        // FAILS
        //var dict = integers.ToDictionary<int, int, decimal>(i => i, line.Compute);

        Console.WriteLine(string.Join(" ", dict.Select(kv => kv.Key + "-" + kv.Value)));
    }
}

public class Line
{
    public decimal A;
    public decimal B;
}

public static class SimpleCompute
{
    public static decimal Compute(this Line line, int value)
    {
        return line.A*value + line.B;
    }
}
14
задан Rob Levine 15 February 2012 в 12:00
поделиться