Коллега передал мне интересный образец кода, который дает сбой 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;
}
}