c# - 类不继承自对象?

标签 c# .net inheritance reflection typeinfo

我正在研究一种使用反射来检查方法的参数类型的方法。此方法遍历 ParameterInfo 并使用这些参数的类型执行某些操作。

我一直假设如果 TypeInfo.IsClasstrue,则此类型是一个类并且始终(间接)派生​​自类型 object (当然,当类型是 object 本身时除外)。因此,如果 TypeInfo.IsClass 为真,则必须设置 TypeInfo.BaseType

好吧,我的假设是错误的!有些类不是从 object 类型派生的。我的假设搞砸了我的代码。

例如:

Type type = typeof(int).MakeByRefType();

type.IsClass 将为 true 并且 type.BaseType 将为 null

如果你仔细想想,这是合乎逻辑的。我可以通过检查 TypeInfo.IsByRef 来防止我的代码崩溃。

现在我的问题是:是否有更多这样的“奇特”类型(除了 ByRef 类型和类型 object),它们是一个类 (IsClass == true) 但没有基类型 (BaseType == null)?

在您回答之前:我仅指的是 IsClass == true 的类型!我的 int 类型示例只是一个示例。它可以是任何类型。 所以请不要:

  • 接口(interface)
  • 结构
  • 无效

到目前为止的答案:

  • ByRef 类型 (T&):如问题中所述。
  • 指针类型 (T*):由 Mark Gravell 发现。

最佳答案

我会说 IsClass 在这里只是误导。它指出:

Gets a value indicating whether the System.Type is a class; that is, not a value type or interface.

它是这样实现的:它检查标志是否包含Interface,以及它是否是ValueType

不幸的是,还有比这更多的东西。指针不是托管类型。 by-ref 与指针非常相似。指针不是 object,尽管在​​通常使用中,强制转换实际上是取消引用/强制转换。这同样适用于诸如 int* 之类的直接指针。

并非 .NET 中的所有内容都是对象 :)

var baseType = typeof(int*).BaseType; // null
bool liesAndMoreLies = typeof(int*).IsClass; // true

Eric Lippert covers this more here: Not everything derives from object - 并列出了一些其他示例(例如,开放泛型类型)。

关于c# - 类不继承自对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16461524/

相关文章:

c# - 从字节数组创建位图

c# - 可能是Visual Studio 2015中的C#编译器错误

c# - 弱引用和非弱引用字典

java - Java中 "methods without access control can be declared more private in subclasses"是什么意思?

C++ 可以不继承成员吗?

c# - 将数据表发送到 WCF 服务时出现序列化错误

c# - 替换字符串中的第一次出现

.NET运行时优化服务

oop - 在没有语言支持类型层次结构的情况下对相关事物的层次结构进行建模

c# - 如何将用户位置映射到不真实的 map ?