类不是从对象继承的?

Mar*_*der 10 .net c# reflection inheritance typeinfo

我正在研究一种方法,该方法使用反射来检查参数类型的方法.这个方法遍历ParameterInfo,并且正在对这些参数的类型做些什么.

我总是假设,如果下TypeInfo.IsClasstrue,这种类型的一类和派生总是(间接地)从式object(当类型为除object当然本身).所以,如果TypeInfo.IsClass是真的,TypeInfo.BaseType必须设置.

我的假设是错的!有些类不是从类型派生的object.我的假设搞砸了我的代码.

例如:

Type type = typeof(int).MakeByRefType();
Run Code Online (Sandbox Code Playgroud)

type.IsClasstruetype.BaseTypenull.

如果你考虑一下,这是合乎逻辑的.我可以通过检查来阻止我的代码崩溃TypeInfo.IsByRef.

现在我的问题是:是否有更多这样的"异国情调"类型(除了ByRef类型和类型object)是一个类(IsClass == true)但没有基类型(BaseType == null)?

在你回答之前:我只是提到那里的类型IsClass == true!我的类型int示例只是一个例子.它可以是任何类型.所以请不要:

  • 接口
  • 结构
  • 空虚

答案到目前为止:

  • ByRef types(T&):在问题中被解密.
  • 指针类型(T*):由Mark Gravell发现.

Mar*_*ell 14

我想说这IsClass只是误导了这里.它指出:

获取一个值,该值指示System.Type是否为类; 也就是说,不是值类型或接口.

它以这种方式实现:它检查标志是否包含Interface,以及它是否为a ValueType.

不幸的是,还有更多的事情.指针不是托管类型.by-ref与指针非常相似.指针不是objects,虽然通常使用的演员实际上是一个de-reference/cast.这同样适用于诸如直接指针之类的东西int*.

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

var baseType = typeof(int*).BaseType; // null
bool liesAndMoreLies = typeof(int*).IsClass; // true
Run Code Online (Sandbox Code Playgroud)

Eric Lippert在这里更多地介绍了这一点:并非所有内容都来自于对象 - 并列出了一些其他示例(例如,开放泛型类型).

  • +1:很好的答案,你找到了另一种"异国情调"类型!:) (3认同)