8得票2回答
理解C#编译器如何处理链接Linq方法

我试着理解当我链接Linq方法时,特别是当多次链接相同的方法时,C#编译器会做什么。 简单的例子:假设我想基于两个条件过滤整数序列。 最明显的做法是像这样: IEnumerable<int> Method1(IEnumerable<int> input) { ...

27得票2回答
通过编译器生成的本地变量将可空结构隐式转换为System.Double:为什么会失败?

给定以下代码,为什么会抛出 InvalidCastException 异常?我看不出来除了 BUG 之外还有其他原因(这段代码在 x86 上运行正常,但在 x64 上会崩溃,并显示 clrjit.dll 中的 0xC0000005 异常)。class Program { static ...

11得票4回答
CIL是一种汇编语言吗?JIT是汇编器吗?

Just In Time Compiler (JIT) 是否真的将程序中的每个 Common Intermediate Language (CIL) 指令映射到底层处理器的操作码(opcodes)? 如果是这样,我们能否称 CIL 为汇编语言,JIT 为汇编器? 注: 维基百科在其汇编语言...

26得票1回答
为什么'unbox.any'没有像'castclass'一样提供有用的异常文本?

为了说明我的问题,考虑以下简单的例子(C#):object reference = new StringBuilder(); object box = 42; object unset = null; // CASE ONE: bad reference conversions (CIL i...

31得票3回答
C#编译器不会优化不必要的类型转换。

几天前,在stackoverflow上为这个问题写答案时,我对C#编译器感到有点惊讶,因为它没有按照我预期的那样工作。请看以下两段代码: 第一段:object[] array = new object[1]; for (int i = 0; i < 100000; i++) { ...

7得票1回答
使用Peverify和ILVerify检测不安全的C#返回类型时出现验证错误

当我验证一个包含返回指针的不安全方法的代码时,遇到了这个问题。 这个例子可以表达为: public class A { public static unsafe int* GetAnswer() { int fakeValue = 42; r...

7得票1回答
成员在另一个模块中声明,需要进行导入。

我使用Mono.Cecil创建了一个新的自定义属性类型,然后将其添加到现有类型中。 为了演示这一点,我有一个名为“Sample”的预先存在的DLL,其中包含一个名为“SampleType”的类型。 我想要使用Mono.Cecil在“Sample”中编织一个名为“NewAttribute”的...

101得票3回答
MSIL方法中hidebysig的目的是什么?

使用ildasm和C#程序,例如。 static void Main(string[] args) { } 提供: .method private hidebysig static void Main(string[] args) cil managed { .entrypoi...

15得票3回答
MS C#编译器和非优化代码

注意:我注意到我发布的示例中存在一些错误 - 现在已进行编辑以修复。 如果不开启优化,官方的C#编译器会做一些有趣的事情。 例如,一个简单的if语句:int x; // ... // if (x == 10) // do something 如果进行了优化,它将变成以下内容:ldlo...

14得票1回答
为什么C#编译器要明确声明类型实现的所有接口?

C#编译器似乎会明确注明它及其基类实现的所有接口,而CLI规范表明这并非必须。我看到一些其他编译器不会明确发出此信息,而且似乎也可以正常工作。C#为什么要这样做,有什么区别或原因吗? C#生成的MSIL(中间语言)如下所示:.class private auto ansi beforefie...