2015-04-13 24 views
5

zu reduzieren downvotes: (Überspringbare zuerst)So überschreiben Sie Basisklassen structs wie int, string?

ich weiß, dass diese Frage sinnlos und \ oder seltsam klingt. Ich erstelle JIT, das C# -Code nimmt, kompiliert es mit csc.exe, extrahiert das IL und paralliere es in CUDA, und ich möchte einige der Dinge in C# überschreiben.

Wie überschreiben grundlegende Dinge wie int \ string? Ich habe versucht:

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) { } 
} 

Aber als ich versuchte:

Test.f(new string()); 

Es error'd Cannot implicitly convert type 'System.String' to 'string'. Ich habe versucht, meine System.String auf nur string im globalen Bereich zu verschieben und es auf der Klasse selbst Fehler. Irgendwelche Ideen wie? Ich denke, irgendwie könnte es helfen, wenn ich meine .cs Dateien ohne diese mscorlib.dll kompilieren kann, aber ich kann keinen Weg finden, es zu tun.

Auch eine Möglichkeit, den csc.exe-Quellcode zu erreichen, kann helfen. (Dies ist kritisch.)

+0

Nun, das Problem, das Sie derzeit haben, ist, dass Ihre Version von 'String' nicht implizit konvertiert werden kann zu Standard 'string' Typ, sie sind 2 völlig separate Typen. Sie können dies jedoch beheben, indem Sie den Operator [implizit] (https://msdn.microsoft.com/de-de/library/z5z9kes2.aspx) überschreiben. – James

+0

@James 'string' ist das ursprüngliche String-Objekt von C#, ich möchte es überschreiben.Wenn ich es in dieses 'Original-String-Objekt' umwandeln werde, kann ich meine neue benutzerdefinierte Zeichenkette nicht verwenden und ich werde die neuen Informationen verlieren, die ich in meiner neuen Zeichenklasse einführen möchte. (Sie haben den Punkt vielleicht verpasst.) – LyingOnTheSky

+1

@LyingOnTheSky, Sie können Ihren neuen Typ verwenden, den Sie wollen, aber Sie können ihn nicht an Code übergeben, der kompiliert wurde, um den ursprünglichen "System.String" -Typ zu erwarten. Schließlich wurde dieser Code kompiliert, bevor Ihr Typ überhaupt geschrieben wurde - wie erwarten Sie, dass er weiß, wie er mit Ihrem Typ arbeitet? Sie müssten 'mscorlib' und alles andere neu kompilieren, um Ihren String-Typ anstelle von' System.String' zu verwenden. –

Antwort

2

Ja, Sie müssen nicht auf mscorlib.dll verweisen. Andernfalls gibt es zwei Klassen System.String, und eindeutig die vordefinierte (C# Spezifikation angegeben) Typ string kann nicht beides sein.

Siehe /nostdlib C# compiler option. Die Seite beschreibt auch, wie Sie dies mit einer Einstellung in der Visual Studio-IDE tun können.

Sie müssen wirklich viele andere erforderliche Typen schreiben (oder sie kopieren und einfügen), wenn Sie nicht auf mscorlib.dll verweisen!

+0

Eine Frage, wenn ich in meinen Code '123' schreibe, wird der Compiler es als Integer behandeln? (Schnelle Antwort kann helfen, aber ich werde trotzdem in ein paar Tagen antworten.) – LyingOnTheSky

+0

Der Compiler wird von der C# -Sprachspezifikation benötigt, um '123' als den vordefinierten Typ' int' zu behandeln, der 'System.Int32' ist. Wenn Sie diesen Typ schreiben und nicht nur den Mscorlib-Typ angeben, sollte Ihr Typ "vordefiniert" "int" sein. Ich bin mir jedoch nicht sicher, ob alles in der Common Language Runtime oder anderswo mit Ihrem Typ funktioniert. Sie haben möglicherweise "fest codierte" Erwartungen an "int", die Ihr "int" verletzen könnte. –

+0

Ich brauche das JIT nicht, um die .NET EXE auszuführen, ich brauche nur die EXE, um die IL zu extrahieren und sie auf dem GPU \ CUDA laufen zu lassen. Überspringen Sie den Teil lexer \ parser, und gehen Sie direkt zum Codegenerierungsteil. Danke übrigens. Ich werde auf weitere Antworten warten. – LyingOnTheSky

2

Sogar eine Möglichkeit, den csc.exe-Quellcode zu erreichen, kann helfen. (Dies ist von entscheidender Bedeutung.)

durch Ihre Kommentare zu urteilen, das ist eigentlich das Bit Sie wirklich Notwendigkeit. (.. Der Versuch, int und string ändern sich bringen würde auch mscorlib und mit ziemlicher Sicherheit die CLR Ändern Ouch)

Zum Glück haben Sie Glück: Microsoft hat Open-Source Roslyn, die nächste Generation C# Compiler, der versenden mit Visual Studio 2015.

Wenn Sie ändern möchten, wie sich der Compiler verhält, können Sie den Code verzweigen und entsprechend ändern. Wenn Sie wirklich nur auf den abstrakten Syntaxbaum (und Ähnliches) zugreifen müssen, können Sie das tun, ohne den Compiler überhaupt zu ändern - Roslyn ist ein "Compiler-API" und nicht nur eine Black-Box, die die Quelle aufnimmt Code und spuckt IL aus. (Als Zeichen dafür, wie reich die API ist, verwendet Visual Studio 2015 die öffentliche API für alles - Intellisense, Refactoring usw.)

+0

@LyingOnTheSky: Warum sollten Sie sich die Mühe machen, eine Kernbibliothek zu ändern und dann den Code zu dekompilieren, anstatt den Compiler zu verwenden, um das relevante Modell zu ermitteln, bevor es generiert wird? –

+0

Entschuldigung, ich habe den letzten Absatz (bis jetzt) ​​nicht verstanden, ich werde mich darum kümmern. – LyingOnTheSky