Не уверен, что я следую за вопросом, но я попробовал следующий код (реализовал все необходимые интерфейсы) и MyCollection myCollection = new MyCollection {"test"};работал нормально.Если у вас все еще есть проблемы, попробуйте объяснить немного больше, что вы сделали.
РЕДАКТИРОВАТЬ: Помимо моего ответа на вопрос, я хотел бы сделать следующее примечание для тех, ктовыполняем первые шаги с использованием контрактов кода.
Чтобы контракты кода отображали предупреждения, должна быть активна статическая проверка (Свойства проекта -> Контракты кода -> Выполнить статическую проверку контракта), которая доступна только в случае премиум-контракта кода.(не стандартная) редакция устанавливается в Visual Studio 2010 Premium или в Team System 2008.
public class MyCollection : ICollection<string>
{
//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Collections.ObjectModel;
//using System.Diagnostics.Contracts;
private readonly ICollection<string> _inner = new Collection<string>();
#region ICollection<string> Members
public void Add(string item)
{
int oldCount = Count;
_inner.Add(item);
Contract.Assume(Count >= oldCount);
}
public void Clear()
{
_inner.Clear();
Contract.Assume(Count == 0);
}
public bool Contains(string item)
{
bool result = _inner.Contains(item);
// without the following assumption:
// "ensures unproven: !Contract.Result<bool>() || this.Count > 0"
Contract.Assume(!result || (Count > 0));
return result;
}
public void CopyTo(string[] array, int arrayIndex)
{
Contract.Assume(arrayIndex + Count <= array.Length);
_inner.CopyTo(array, arrayIndex);
}
public bool Remove(string item)
{
return _inner.Remove(item);
}
public int Count
{
get
{
Contract.Ensures(Contract.Result<int>() == _inner.Count);
return _inner.Count;
}
}
public bool IsReadOnly
{
get { return _inner.IsReadOnly; }
}
public IEnumerator<string> GetEnumerator()
{
return _inner.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
РЕДАКТИРОВАТЬ 2:
Есть некоторые обходные пути, выберите одинкоторый лучше всего подходит вам:
- Добавить отсутствующий Contract.Asserts, как видно из приведенного выше примера кода;
- Вместо реализации ICollection, присущей Collection;
- Использовать StringCollection
Решения были взяты из сообщения на форуме DevLabs: Проблемы со статической проверкой и оберткой вокруг общего списка .
РЕДАКТИРОВАТЬ 3 (от Allrameest):
- Добавлено
Contract.Ensures(Contract.Result<int>() == backEndCollection.Count);
в свойство Count, о котором упоминается KoMet. - В метод CopyTo добавлено
Contract.Assume(arrayIndex + Count <= array.Length);
. - Удалено
Contract.Assert(_inner.Count == 0);
из метода Clear.