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

How do I tell in c# codecontracts that a external method never returns null?

我有以下一段 C# 代码:

myClaimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value;

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

Warning CodeContracts: Possibly calling a method on a null reference. Do you expect that System.Security.Claims.ClaimsIdentity.FindFirst(System.String) returns non-null?

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

简单的做法是:

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

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

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