" is " 运算符在内部是如何工作的?

6

我想比较一个对象的类型和另一个类型是否相同。我没有这个对象,只有对象的类型。

我可以使用 type1 == type2 来进行一般的相等性比较。

我可以使用递归循环来重复上述步骤,直到 BaseType 为 null 为止,以此来比较 type1.BaseTypetype2 是否相同。

我可以使用 type1.GetInterface(type2.FullName) != null 来检查 type2 是否是 type1 的接口。

如果将它们结合起来,就可以得到:

if ( type2.IsInterface )
  return type1.GetInterface( type2.FullName ) != null;

while ( type1 != null ) {
  if ( type1 == type2 )
    return true;

  type1 = type1.BaseType;
}
return false;

“is”关键字只是这样的吗?我找不到正确的关键字来在Reflector搜索中找到该函数,而且在谷歌搜索“is”也没有什么帮助。


9
这取决于“is”这个词的意思是什么。 - Larry Hipp
+1 有趣。然而,我认为“is”关键字是在运行时本地实现的,不使用反射。 - tster
3
我从未想过我会在 Stack Overflow 上看到一句有关比尔·克林顿的相关语录。 - György Andrasek
3
好的,我会尽力进行翻译。以下是需要翻译的内容:See also https://dev59.com/lHNA5IYBdhLWcg3wAItP请参见 https://dev59.com/lHNA5IYBdhLWcg3wAItP - Donnie
C++中是否有type_info和typeid()的底层实现? - rkellerm
1个回答

6

is (§14.9.10 of the standard) 通常使用 isinst,但如果编译时类型通过某些转换兼容,则不需要使用。

一个等效的(相反的)Type对象是IsAssignableFrom。所有这些都是真的:

"foo" is String;
"foo" is object;

typeof(String).IsAssignableFrom("foo".GetType());
typeof(object).IsAssignableFrom("foo".GetType());

1
要小心,isinst指令并不总是会被生成。C#编译器可以判断你是否在做蠢事,并会生成与null的比较而不是isinst - Jason Punyon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接