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
是正确的,但事实并非如此。
给定以下代码:
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
是正确的,但事实并非如此。