2015-04-13 15 views
5

Per ridurre downvotes: (ignorabili in un primo momento)Come sovrascrivere le classi di base structs come int, string?

Mi rendo conto che questa domanda suona inutile e \ o strano. Sto creando JIT che prende il codice C# lo compila con csc.exe, estrae l'IL e lo confronta in CUDA, e voglio scavalcare alcune cose in C#.

Come ignorare le cose di base come int \ string? ho provato:

class String { /* In namespace System of course */ 
    BasicString wrap_to; 
    public String() { 
     wrap_to = new BasicString(32); // capacity 
    } 
    public String(int Count) { 
     wrap_to = new BasicString(Count); 
    } 
    public char this[ int index ] { 
     get { return wrap_to[ index ]; } 
     set { 
      if (wrap_to.Handlers != 1) 
       wrap_to = new BasicString(wrap_to); 
      wrap_to[ index ] = value; 
     } 
    } 
    ... 
} 
... // not in namespace System now 
class Test { 
    public static void f(string s) { } 
} 

ma quando ho provato:

Test.f(new string()); 

E error'd Cannot implicitly convert type 'System.String' to 'string'. Ho provato a spostare il mio System.String a solo string nell'ambito globale e si è verificato l'errore sulla classe stessa. Qualche idea come? Penso che in qualche modo potrebbe aiutare se riesco a compilare i miei file .cs senza quello mscorlib.dll, ma non riesco a trovare un modo per farlo.

Anche un modo per raggiungere il codice sorgente csc.exe può essere d'aiuto. (Questo è fondamentale.)

+0

Beh, il problema che si ha attualmente è la versione di 'String' non può essere convertita implicitamente al tipo standard 'stringa', sono 2 tipi completamente separati. Tuttavia, è possibile risolvere questo problema sostituendo l'operatore [implicito] (https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx). – James

+0

@James 'string' è l'oggetto stringa originale di C#, voglio sovrascriverlo.Se lo convertirò in quell'oggetto 'stringa originale 'non sarò in grado di usare la mia nuova stringa personalizzata e perderò le nuove informazioni che voglio introdurre nella mia nuova classe di stringhe. (Hai perso il punto forse.) – LyingOnTheSky

+1

@LyingOnTheSky, puoi usare il tuo nuovo tipo tutto ciò che vuoi, ma non sarai in grado di passarlo al codice che è stato compilato per aspettarti il ​​tipo originale 'System.String'. Dopo tutto, quel codice è stato compilato prima che il tuo tipo sia mai stato scritto - come ti aspetti che sappia come lavorare con il tuo tipo? Dovresti ricompilare 'mscorlib' e tutto il resto per usare il tuo tipo di stringa invece di' System.String'. –

risposta

2

Sì, non sarà necessario fare riferimento a mscorlib.dll. Altrimenti ci saranno due classi System.String, e chiaramente il tipo predefinito (C# Specification given) string non può essere entrambi.

Vedere /nostdlib C# compiler option. La pagina descrive anche come farlo con un'impostazione nell'IDE di Visual Studio.

È necessario scrivere molti altri tipi necessari (oppure copiarli e incollarli) quando non si fa riferimento a mscorlib.dll!

+0

Una domanda, quando scriverò nel mio codice '123' il compilatore lo tratterà come intero? (La risposta rapida può aiutare, ma risponderò comunque tra qualche giorno.) – LyingOnTheSky

+0

Il compilatore è richiesto dalla specifica del linguaggio C# per trattare '123' come il tipo predefinito' int', che è 'System.Int32'. Se scrivi quel tipo piuttosto che solo il tipo mscorlib, il tuo tipo dovrebbe essere "predefinito" "int". Tuttavia non sono sicuro che tutto nel Common Language Runtime o altrove funzioni con il tuo tipo. Potrebbero avere aspettative "hardcoded" su "int" che il tuo "int" potrebbe violare. –

+0

Non ho bisogno del JIT per eseguire l'EXE .NET, ho solo bisogno dell'EXE per estrarre l'IL e farlo funzionare sulla GPU \ CUDA. È saltare la parte lexer \ parser e andare direttamente alla parte di generazione del codice. Grazie a proposito. Aspetterò comunque più risposte. – LyingOnTheSky

2

Anche un modo per raggiungere il codice sorgente csc.exe può essere d'aiuto. (Questo è fondamentale.)

A giudicare dai vostri commenti, questo è in realtà la punta si davvero necessità. (.. Cercando di cambiare int e string stessi comporterebbe cambiare mscorlib e quasi certamente il CLR e Ouch)

Fortunatamente, siete fortunati: Microsoft ha open-source Roslyn, la prossima generazione compilatore C# che spedirà con Visual Studio 2015.

Se si desidera modificare il comportamento del compilatore, è possibile eseguire il fork del codice e modificarlo in modo appropriato. Se hai davvero bisogno di ottenere l'albero della sintassi astratta (e simili), puoi farlo senza modificare il compilatore - Roslyn è designato come "un'API del compilatore" piuttosto che una black-box che prende in considerazione codice e sputa IL. (Come un segno di quanto sia ricca l'API, Visual Studio 2015 utilizza l'API pubblica per tutto: Intellisense, refactoring, ecc.)

+0

@LyingOnTheSky: Perché passare al problema di modificare una libreria principale e quindi decompilare il codice, piuttosto che utilizzare il compilatore per ottenere il modello rilevante prima che venga generato? –

+0

Mi spiace di non aver capito l'ultimo paragrafo (fino ad ora), lo esaminerò. – LyingOnTheSky