如何在c#codecontracts中告诉外部方法永远不会返回null?

时间:2015-05-11 16:37:04

标签: c# code-contracts

我有以下一段c#代码:

myClaimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value;

CodeContract知道myClaimsIdentity永远不会为null。但它抱怨FindFirst(string)方法可能返回null:

  

警告CodeContracts:可能在空引用上调用方法。您是否期望System.Security.Claims.ClaimsIdentity.FindFirst(System.String)返回非null?

我确实希望如此,但我怎么能告诉CodeChecker?当然,我无法更改FindFirst(string),因为它来自外部库。

1 个答案:

答案 0 :(得分:2)

简单的方法是:

var nameIdentifier = myClaimsIdentity.FindFirst(ClaimTypes.NameIdentifier);
Contract.Assume(nameIdentifier != null);
nameIdentifier.Value;

代码合同不会尝试证明Assume条件,但会在证明其他要求时使用它。

可能可以为具有适当Ensures后置条件的外部代码创建合同引用程序集。代码合同团队为BCL类型执行此操作。但我不知道该怎么做。