gpt4 book ai didi

.net - ReadOnlyCollection 实现 IList 但不实现 add 方法

转载 作者:行者123 更新时间:2023-12-05 00:26:13 24 4
gpt4 key购买 nike

怎么会System.Collections.ObjectModel.ReadOnlyCollection<T>实现 System.Collections.Generic.IList<T>但没有实现它的Add方法?

我不是在问为什么它没有 Add方法——这很明显,因为它应该是只读的;我在问它如何在不实现 IList<T> 所要求的方法的情况下逃脱。接口(interface)契约。

最佳答案

它显式地实现了该方法,以及其他几个通常会改变底层集合的方法。请参阅 部分显式接口(interface)实现 在以下页面上:

ReadOnlyCollection<T>
Add 的备注部分方法表明他们为什么使用显式实现:

This member is an explicit interface member implementation. It can be used only when the ReadOnlyCollection<T> instance is cast to an ICollection<T> interface.



因此,开发人员无法调用 Add直接在 ReadOnlyCollection<T> 的实例上使用方法(无论如何这都没有意义)。当接口(interface)方法的实现由于实现类上的附加约束而总是抛出异常时,经常使用显式接口(interface)实现(在这种情况下,对象是只读的)。

欲了解更多信息,请参阅页面 Explicit Interface Implementation (C# Programming Guide)

奖励用例:

我使用显式接口(interface)实现的另一个地方是接口(interface)方法的实现过于复杂,派生类型可能会在逻辑中引入错误。例如,考虑 IOleCommandTarget.QueryStatus 的复杂实现这里 (reference source) .此代码是所有样板代码,仅用于正确行为的目的。它实际上并不提供任何命令的状态。
/// <inheritdoc/>
int IOleCommandTarget.QueryStatus(ref Guid guidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
using (OleCommandText oleCommandText = OleCommandText.FromQueryStatus(pCmdText))
{
Guid cmdGroup = guidCmdGroup;
for (uint i = 0; i < cCmds; i++)
{
OLECMDF status = QueryCommandStatus(ref cmdGroup, prgCmds[i].cmdID, oleCommandText);
if (status == default(OLECMDF) && _next != null)
{
int hr = _next.QueryStatus(ref cmdGroup, cCmds, prgCmds, pCmdText);
if (ErrorHandler.Failed(hr))
return hr;
}
else
{
prgCmds[i].cmdf = (uint)status;
}
}

return VSConstants.S_OK;
}
}

我将以下更简单的方法公开为 protected virtual而不是仅仅制作接口(interface)方法 public virtual ,派生类型不需要担心正确解释 pCmdText参数或如何处理 _next prgCmds 中的每一项 (reference source) .
/// <summary>
/// Gets the current status of a particular command.
/// </summary>
/// <remarks>
/// The base implementation returns 0 for all commands, indicating the command is
/// not supported by this command filter.
/// </remarks>
/// <param name="commandGroup">The command group.</param>
/// <param name="commandId">The command ID.</param>
/// <param name="oleCommandText">A wrapper around the <see cref="OLECMDTEXT"/>
/// object passed to <see cref="IOleCommandTarget.QueryStatus"/>, or
/// <see langword="null"/> if this parameter should be ignored.</param>
/// <returns>A collection of <see cref="OLECMDF"/> flags indicating the current
/// status of a particular command, or 0 if the command is not supported by the
/// current command filter.</returns>
protected virtual OLECMDF QueryCommandStatus(ref Guid commandGroup, uint commandId, OleCommandText oleCommandText)
{
return default(OLECMDF);
}

关于.net - ReadOnlyCollection<T> 实现 IList<T> 但不实现 add 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com