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.)
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
@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
@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. –