Инвариант класса для обеспечения того, чтобы определенный тип данных в поле не содержал - PullRequest
0 голосов
/ 20 декабря 2018

Учитывая следующий код:

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 голосов
/ 20 декабря 2018

К сожалению, вы можете хранить объекты в int[], которые на самом деле не являются int[].Есть некоторые действительные преобразования, которые, как вы надеетесь, не будут действительными, но на самом деле это так.Например, кто-то может написать:

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

, и теперь тип ints является массивом без знака int, а не массивом int.Это преобразование действительно неудачно (что оно действительно почти исключительно вызывает ошибки, когда оно возникает);было бы замечательно, если бы то, что вы опубликовали , могло бы быть инвариантом, но, к сожалению, Contract.Invariant правильно, что это не так.

...