给出以下代码:
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[])
会失败。
答案 0 :(得分:2)
遗憾的是,实际上您可以将实际上不是int[]
的对象存储在int[]
中。您希望有一些有效的转换是无效的,但实际上是有效的。例如,有人可以写:
ints = (int[])(object)new uint[5];
,现在ints
的类型是一个无符号的int数组,而不是一个int数组。不幸的是,这种转换是有效的(当转换生效时,它几乎仅会引起错误);如果您发布的内容可以不变,那就太好了,但是很遗憾,Contract.Invariant
是正确的,