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'参数,因此它也必须在返回之前在内部设置其输出参数)?
就像我说的那样,我错过了一些明显的东西.(我需要睡觉!)
问题在于,如果你的第一个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)
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |