Class 不变以确保字段上的特定数据类型不成立

Class invariant to ensure a particular data type on a field does not hold

给定以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics.Contracts;

using System;

public class Program
{
    public int[] ints = new int[1000];

  [ContractInvariantMethod]
  private void ObjectInvariant ()
  {
    Contract.Invariant(ints.GetType() == typeof(int[]));
    Contract.Invariant(ints != null);
  }
}

为什么不变量ints.GetType() == typeof(int[])被认为无法证明?如果我将不变量更改为 ints.GetType() == ints.GetType() 它会通过(没有任何意外),但为什么它会因 typeof(int[]).

而失败

遗憾的是,您实际上可以将对象存储在 int[] 中,但实际上并不是 int[]。有一些您希望无效的有效转换,但实际上是有效的。例如,有人可以写:

ints = (int[])(object)new uint[5];

现在ints的类型是unsigned int数组,而不是int数组。不幸的是,这种转换是有效的(它几乎完全有效,只是在出现时导致错误);如果您发布的 可以 是不变的,那就太好了,但遗憾的是,Contract.Invariant 是正确的,但事实并非如此。