2012-07-02 17 views
14

Ho un codice C# che compila bene sia con i compilatori mono sia con quelli di Microsoft, ma funziona solo su mono. Il messaggio di errore è a capo (aggiunte da me)Problemi con tipo generico ricorsivo in 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. 

Il tipo ha in realtà una definizione generica ricorsiva, quindi la mia domanda è: perché funziona con il mono? [Il codice viene eseguito e produce il risultato atteso]

Il codice sorgente completo è qui: https://github.com/miniBill/Hasse

codice ridotto, che si blocca ancora è qui:

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>(); 
    } 
} 

Ecco la prova che funziona su mono: http://ideone.com/ZvA3I

+11

Invece di darci il link a un grande progetto, sarebbe utile se si potesse * dopo * un breve (minimo), ma esempio completo che dimostra il problema. –

+0

Lasciatemi provare e creare un esempio minimo – miniBill

+0

Fine. Ci sono voluti un po 'di tempo :) – miniBill

risposta

6

Questo è un problema known. Potrebbe essere segnalato come errore del compilatore.

http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf (pagina 129)

Per quanto riguarda il lavoro in Mono, ci sono molti posti in cui Mono di lavoro è "spezzato" per quanto riguarda le specifiche è interessato.

(Recursive lambdas sono un altro exmaple di qualcosa che funziona in Mono che non dovrebbe)

+0

Grazie. Anche se sospetto che funzioni in Mono per la stessa ragione, fa ricaduti lambda: potrebbe esplodere, ma potrebbe avere senso (come faceva il mio codice) – miniBill

+0

Puoi archiviare il problema "ricorsive lambdas" in http: //bugzilla.xamarin. com/per favore? – knocte