Как указать неоднозначность результата с помощью атрибутов Resharper CodeAnnotation?

Используя атрибуты аннотаций кода Resharper, я пытаюсь написать атрибут ContractAnnotation для метода, который всегда будет возвращать значение null, если входные данные равны нулю, но будет возвращать либо значение null, либо значение, если входные данные не равны нулевой. Что-то типа:

[ContractAnnotation("null => null; notnull => null||notnull")]

Я бы просто написал это отдельно:

[ContractAnnotation("null => null")]

За исключением того, что в соответствии с аннотациями к контракту в ReSharper 7 это будет автоматически дополнено чем-то недопустимым:

null => null опускает имя параметра, если параметр только один. По сути, null => null означает, что если параметр имеет значение null, возвращаемое значение метода также равно null. Обратите также внимание, что эта аннотация автоматически дополняется notnull => notnull.

Как я могу написать атрибут ContractAnnotation, чтобы указать, что он не может быть уверен, какое возвращаемое значение, когда вход notnull?

Или, в качестве альтернативы, как я могу остановить автоматическое дополнение моей аннотации null => null notnull => notnull


Дополнительный вопрос:

Как я мог написать что-то вроде следующего:

[ContractAnnotation("null => true; notnull => true||false")]

Или в таком случае будет ли этого достаточно, поскольку оно автоматически не дополняется обратным?

[ContractAnnotation("null => true")]

person Ben Jenkinson    schedule 23.01.2015    source источник


Ответы (1)


Вы можете использовать canbenull:

[ContractAnnotation("null => null; notnull => canbenull")]

Полная грамматика:

FDT      ::= FDTRow [;FDTRow]*
FDTRow   ::= Input => Output | Output <= Input
Input    ::= ParameterName: Value [, Input]*
Output   ::= [ParameterName: Value]* {halt|stop|void|nothing|Value}
Value    ::= true | false | null | notnull | canbenull

Что касается бонусного вопроса, [ContractAnnotation("null => true")] должно быть достаточно. Говорить, что функция, возвращающая bool, может возвращать true или false, излишне, поскольку она не может возвращать ничего другого.

person Lucas Trzesniewski    schedule 23.01.2015
comment
Спасибо! Я полностью пропустил значение canbenull, когда читал документацию. Что вы думаете о бонусном вопросе, который я добавил выше? - person Ben Jenkinson; 23.01.2015
comment
@Ben Я добавил ответ на бонусный вопрос - person Lucas Trzesniewski; 23.01.2015
comment
Да, вы правы, это было бы избыточно, я просто не был уверен, что вы должны однозначно указывать все возможные пути выполнения. - person Ben Jenkinson; 23.01.2015