Я пытаюсь добавить поддержку сценариев Python в существующую библиотеку C #, используя IronPython. Тем не менее, при попытке использовать методы расширения Linq на одной из моих структур, которая является IEnumerable , я получаю исключение System.Collections.Generic.IEnumerable`1[TSource] contains generic parameters'
, тогда как при изменении типа на класс он работает как ожидалось.
Вот некоторый перегруженный код, который отображает то же поведение. Как уже упоминалось, замена A на класс решает проблему, но это приведет к ненужной генерации мусора в моем реальном коде проекта, поэтому я предпочел бы не прибегать к этому. Я использую IronPython 2.7.9 от Nuget.
using IronPython.Hosting;
using Microsoft.Scripting;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace IronPython279
{
public struct A : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator() => new List<int>(new[] { 1, 2, 3 }).GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
class Program
{
static void Main(string[] args)
{
var engine = Python.CreateEngine();
var scope = engine.CreateScope();
var sourceCode = new StringBuilder();
sourceCode.AppendLine("import clr");
sourceCode.AppendLine($"clr.AddReference(\"{nameof(System)}.Core\")");
sourceCode.AppendLine($"clr.AddReference(\"{nameof(IronPython279)}\")");
sourceCode.AppendLine($"import {nameof(System)}");
sourceCode.AppendLine($"import {nameof(IronPython279)}");
sourceCode.AppendLine($"from {nameof(IronPython279)} import {nameof(A)}");
sourceCode.AppendLine($"clr.ImportExtensions({nameof(System)}.{nameof(System.Linq)})");
sourceCode.AppendLine($"a = {nameof(A)}()");
sourceCode.AppendLine($"b = a.{nameof(System.Linq.Enumerable.First)}()");
var source = engine.CreateScriptSourceFromString(sourceCode.ToString(), SourceCodeKind.Statements);
source.Execute(scope);
}
}
}
Что означает эта ошибка (она говорит о том, что это правда, но не о том, почему это проблема), и есть ли другие обходные пути, кроме перехода на класс?