如何重写基类结构,如整数、字符串



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

我知道这个问题听起来毫无意义和/或奇怪。我正在创建 JIT,它采用 C# 代码使用 csc.exe 编译它,提取 IL 并将其平行化为 CUDA,我想覆盖 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,但它在类本身上出错了。有什么想法吗?我认为如果我可以在没有那个mscorlib.dll的情况下编译我的 .cs 文件,它会有所帮助,但我找不到一种方法来做到这一点。

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

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

请参阅 /nostdlib C# 编译器选项。该页还介绍了如何使用Visual Studio IDE中的设置来执行此操作。

当您不引用时,您需要编写许多其他必需的类型(或复制粘贴它们mscorlib.dll

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

从您的评论来看,这实际上是您真正需要的一点。(试图改变intstring本身将涉及改变mscorlib,几乎可以肯定的是,CLR也是如此。哎哟。

幸运的是,你很幸运:Microsoft开源了Roslyn,这是Visual Studio 2015附带的下一代C#编译器。

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

最新更新