2012-07-02 6 views
14

У меня есть код на C#, который компилируется как под моно, так и с компиляторами Microsoft .net, но работает только на моно. Сообщение об ошибке (новые строки, добавленные мной)Проблемы с рекурсивным общим типом в C#

Unhandled Exception: System.TypeLoadException: 
Could not load type 'Hasse.Groups.Heavy.Product.PowerGroup`1' 
from assembly 'Hasse, Version=1.0.x.y, Culture=neutral, PublicKeyToken=null' 
because it has recursive generic definition. 

типа на самом деле имеет рекурсивную общее определение, так что мой вопрос: почему он работает с моно? [Код запускается и выдает ожидаемый результат]

Полный исходный код находится здесь: https://github.com/miniBill/Hasse

Уменьшенный код, который по-прежнему падает здесь:

public class Group<T> : IWrappableGroup<WrapperGroup<T>> {} 

public class WrapperElement<T> {} 

public interface IWrappableGroup<U> {} 

public class WrapperGroup<T> : Group<WrapperElement<T>> {} 

class MainClass { 
    public static void Main(string[] args){ 
     var ng = new Group<object>(); 
    } 
} 

Вот доказательство того, что он работает на моно: http://ideone.com/ZvA3I

+11

Вместо того, чтобы дать нам ссылку на большой проект, было бы полезно, если бы вы могли * сообщение * короткий (минимальный), но полный пример, который демонстрирует проблему. –

+0

Позвольте мне попытаться создать минимальный пример – miniBill

+0

Готово. Взял некоторое время :) – miniBill

ответ

6

Это вопрос known. Это может быть сообщено как ошибка компилятора.

http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf (страница 129)

Что касается работы в Mono, есть несколько мест, где Mono работает «ломается», насколько спецификации обеспокоен.

(Recursive lambdas являются еще одним exmaple чего-то, что работает в моно, что не должны)

+0

Спасибо. Хотя я подозреваю, что он работает в Mono по той же причине, что и рекурсивные lambdas: он может взорваться, но может иметь смысл (например, мой код) – miniBill

+0

Можете ли вы записать проблему «рекурсивных лямбда» в http: //bugzilla.xamarin. com/пожалуйста? – knocte

Смежные вопросы