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

时间:2018-12-20 15:52:56

标签: c# code-contracts invariants

给出以下代码:

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[])会失败。

enter image description here

1 个答案:

答案 0 :(得分:2)

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

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

,现在ints的类型是一个无符号的int数组,而不是一个int数组。不幸的是,这种转换是有效的(当转换生效时,它几乎仅会引起错误);如果您发布的内容可以不变,那就太好了,但是很遗憾,Contract.Invariant是正确的,