我如何在 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 类型执行此操作。但是我不知道该怎么做。
我有以下一段 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 类型执行此操作。但是我不知道该怎么做。