如何为 out 参数指定 Ensures?

How to specify Ensures for out parameter?

我有一个带有 out 参数的方法,我想使用 Contract.Ensures() 指定当方法 return 时,参数将不会是 null

基本上,这个:

void M(out object o)
{
    Contract.Ensures(o != null);

    o = new object();
}

这不会编译,因为看起来参数在分配之前会被读取:

error CS0269: Use of unassigned out parameter 'o'

我以为我可以通过换行来解决这个问题,但这也不起作用:

warning CC1005: CodeContracts: Malformed contract. Found Ensures after assignment in method 'M(System.Object@)'.

有什么办法吗?

我不想将方法切换到 ref。我不能 return 值而不是使用 out,因为我遇到这个的实际方法已经有一个 return 值:bool TryGetValue(TKey1 key1, TKey2 key2, out TValue value).

Contract.ValueAtReturn 方法专门用于避免 C# 编译器在此处的错误。

Contract.Ensures(Contract.ValueAtReturn(out o) != null);