Коллега передал мне интересный пример кода, который сработает с InvalidProgramException
( "CLR обнаружил Invalid Program" ) при запуске.
Проблема, похоже, происходит во время JIT, так как это компилируется отлично, но генерирует исключение только перед тем, как метод с "оскорбительной" строкой вызывается - я думаю, что это JIT'd.
В рассматриваемой строке вызывается 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;
}
}