【问题标题】:How does the " is " operator work internally"is" 操作符在内部是如何工作的
【发布时间】:2010-05-24 15:33:13
【问题描述】:

我想将对象的类型与类型进行比较,看看它们是否相同。我没有对象,只有对象的类型。

我可以通过type1 == type2 获得普遍平等

我可以有一个递归循环,我对type1.BaseType 重复上述步骤,直到 BaseType 为空。

我可以通过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”并没有真正的帮助

【问题讨论】:

  • 这要看'is'这个词是什么意思
  • +1 有趣。但是,我会假设“is”关键字是在运行时本地实现的,并且不使用反射。
  • 我从没想过我会在 SO 上看到相关的比尔·克林顿引述。
  • 有C++ type_info 和 typeid() 底层吗?

标签: .net


【解决方案1】:

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

Type 对象的等价物(反向)是IsAssignableFrom。这些都是真的:

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

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

【讨论】:

  • 小心,isinst 指令并不总是生成。 C# 编译器可以判断您何时愚蠢,并将生成与 null 而不是 isinsts 的比较。
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多