IronPython «Тип IEnumerable`1 [TSource] содержит общие параметры» при использовании расширений Linq на структурах IEnumerable <T> - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь добавить поддержку сценариев 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);
        }
    }
}

Что означает эта ошибка (она говорит о том, что это правда, но не о том, почему это проблема), и есть ли другие обходные пути, кроме перехода на класс?

...