为什么这个方法带有'out'参数说它没有设置?

Mar*_*eIV 0 c# out trygetvalue

啊!嗯,我要张贴这是一个问题,因为我不知道为什么我看到的错误...但当然现在这么明显,当我看到它.现在把自己打倒在脑袋里.我会把它放在这里以获得乐趣.看看你是否能抓住它.

今晚为我们的WeakDictionary类实现TryGetValue时,我遇到了一些奇怪的事情.我收到错误,我不知道为什么.

这是代码:

public bool TryGetValue(TKey key, out TItem value)
{
    WeakReference<TItem> weakReference;

    if(_itemStorage.TryGetValue(key, out weakReference))
        if(weakReference.TryGetTarget(out value))
            return true;
    else
        value = default(TItem);

    return false;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

必须在控制离开当前方法之前将out参数'value'分配给.

对我来说,看起来所有代码路径都会在返回之前设置'value'.

如果第一个'if'失败,'else'子句设置'value'.

但是,如果第一个'if'通过,那么下一行'weakReference.TryGetTarget'设置'value'的原因与我被警告的完全相同(即'TryGetTarget'本身有一个'out'参数,因此它也必须在返回之前在内部设置其输出参数)?

就像我说的那样,我错过了一些明显的东西.(我需要睡觉!)

Yuv*_*kov 7

问题在于,如果你的第一个if语句失败,你的价值就会被未初始化.

基本上,你在if语句中缺少大括号,这将使else语句正确附加到正确的if:

if (_itemStorage.TryGetValue(key, out weakReference))
{
    if (weakReference.TryGetTarget(out value))
        return true;
}
Run Code Online (Sandbox Code Playgroud)

文档明确了这一点:

then语句和else语句中的语句可以是任何类型,包括嵌套在原始if语句中的另一个if语句.在嵌套的if语句中,如果没有相应的else,则每个else子句都属于last.

这意味着,您的else子句被附加到内部if语句,而不是外部语句.

您也可以将其重写为:

public bool TryGetValue(TKey key, out TItem value)
{
    WeakReference<TItem> weakReference;

    if (_itemStorage.TryGetValue(key, out weakReference))
        return weakReference.TryGetTarget(out value);

    value = default(TItem);
    return false;
}
Run Code Online (Sandbox Code Playgroud)