Проблемы с рекурсивным родовым типом в С#
У меня есть код С#, который компилируется как под моно, так и с компиляторами Microsoft.net, но работает только на моно.
Сообщение об ошибке (новые строки добавлены мной)
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
Ответы
Ответ 1
Это известная проблема. Это может быть сообщено как ошибка компилятора.
http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf (стр. 129)
Что касается работы в Mono, есть несколько мест, где работа Mono "ломается" в отношении спецификаций.
(Рекурсивные лямбды являются еще одним примером того, что работает в Mono, которое не должно)