1

我一直在研究使用 ILSpy 的 .NET 程序集。我想知道“IS”(和“AS”)关键字在哪里定义,所以我可以看看它的定义,看看“IS”运算符是如何在.NET中定义的。谢谢

4

4 回答 4

8

它们在C# 的语言规范中定义并在编译器中实现,而不是特定的程序集。尽管使其在运行时工作所需的功能应该在mscorlib中,即 Just In Time 编译器。

如果您在 ECMA 上为 C# 4 标红(上面链接),您会is operator在第 14.9.10 节和as operator第 14.9.11 节中找到。

编译时 is 运算符变成Isinst指令:

public bool IsDateTime(object o)
{
    return o is DateTime;
}

变成:

.method public hidebysig instance bool IsDateTime(object o) cil managed
{
  .maxstack  8
  ldarg.1
  isinst     [mscorlib]System.DateTime
  ldnull
  cgt.un
  ret
}

as operator也可以编译为 Isinst 指令:

public String AsString(object o)
{
    return o as String;
}

变成:

.method public hidebysig instance string AsString(object o) cil managed
{
    .maxstack  8
    ldarg.1     
    isinst     [mscorlib]System.String
    ret
}

这些指令在公共语言基础设施规范中定义,Isinst 在第 III.4.6 节中定义。

于 2013-07-05T10:42:16.017 回答
3

关键字是语言的一部分,而不是 API。

于 2013-07-05T10:41:53.363 回答
2

两者isas都直接翻译成 CIL 指令Isinst。并且 cast 运算符被翻译成Castclass.

您可以从CLI 规范中了解更多关于这些指令的信息。

于 2013-07-05T10:48:15.647 回答
1

isas是语言元素,如forwhileswitchforeach。它们没有在任何程序集中定义。

于 2013-07-05T10:43:02.537 回答