如何重写 base classes\structs 比如 int, string?

How to override base classes\structs such as int, string?

减少反对票:(一开始可以跳过)

I am aware that this question sounds pointless and\or weird. I am creating JIT that takes C# code compiles it with csc.exe, extracts the IL and parallize it into CUDA, and I want to override some of the things in C#.

如何覆盖 int\string 等基本内容? 我试过了:

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

但是当我尝试时:

Test.f( new string( ) );

它出错了Cannot implicitly convert type 'System.String' to 'string'。我尝试将我的 System.String 移动到全局范围内的 string 并且它在 class 本身上出错。任何想法如何?我认为如果我可以在没有 mscorlib.dll 的情况下编译我的 .cs 文件,它可能会有所帮助,但我找不到方法来做到这一点。

即使是获取 csc.exe 源代码的方法也可能有所帮助。 (这很关键。)

是的,您将不必引用 mscorlib.dll。否则会有两个System.String 类,显然预定义的(给定的C#规范)类型string不能是它们两个。

参见 /nostdlib C# compiler option。该页面还介绍了如何使用 Visual Studio IDE.

中的设置进行操作

当您不参考 mscorlib.dll!

时,您确实需要编写许多其他必需的类型(或复制粘贴它们)

Even a way to reach to csc.exe source code may help. (This is critical.)

从您的评论来看,这实际上是您真正需要的部分。 (尝试更改 intstring 本身将涉及更改 mscorlib 并且几乎肯定还会更改 CLR。​​哎呀。)

幸运的是,您很幸运:Microsoft 开源了 Roslyn,下一代 C# 编译器将在 Visual Studio 2015 中发布。

如果您想更改编译器的行为方式,您可以分叉代码并对其进行适当修改。如果您真的只需要获取抽象语法树(等等),那么您完全可以在不更改编译器的情况下做到这一点——Roslyn 被设计成一个 "compiler API" 而不仅仅是一个黑盒子,它接受源代码并吐出 IL。 (作为 API 多么丰富的标志,Visual Studio 2015 对所有内容都使用 public API - 智能感知、重构等)