Как сказать кодовым контрактам, что делегат, указанный в качестве аргумента, является Pure? - PullRequest
5 голосов
/ 14 февраля 2011

Рассмотрим следующий код:

int SomeField;
void Foo([Pure] Func<int, object> getData)
{
    Contract.Requires(getData != null);
    Contract.Requires(getData(this.SomeField) != null);
}

Я получаю следующее предупреждение:

Обнаружен вызов метода 'System.Func'2<System.Int32,System.Object>.Invoke(System.Int32)' без [Pure] в контрактах метода '.... Foo(System.Func'2<System.Int32,System.Object>)'

Это предупреждение имеет смысл. Но я все еще хотел бы вызвать делегата в контрактах и ​​не получать предупреждение (предположим, у меня предупреждения превратились в ошибки). Как мне этого добиться?

Я попробовал атрибут Pure, как показано в примере, но это не работает.

Я также хотел бы знать, почему PureAttribute можно указать в параметрах. Не имеет смысла, если тип параметра не является типом делегата, и даже если это так, он не будет работать так, как я ожидал, как я уже говорил выше.

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Способ сделать это с текущей библиотекой Code Contracts - объявить свой собственный тип делегата, например:

[Pure]
public delegate U PureFunc<in T, out U>(T thing);

Я думаю, что причина, по которой он не работает с параметрами делегата, заключается в том,было бы очень трудно проверить в целом:)

1 голос
/ 14 февраля 2011

Я не привык к структуре контрактов, но из чисто логического способа делегат не может быть чистым, просто потому, что он может принять любой метод, выполняющий подпись.Вы не можете гарантировать это для всех методов, подходящих для этого делегата, поскольку для разрыва контракта требуется только один.

...