【发布时间】:2015-06-20 16:09:46
【问题描述】:
考虑这些代码行:
ConcurrentDictionary<string, object> error = new ConcurrentDictionary<string, object>();
error.Add("hello", "world"); //actually throws a compiler error
和
IDictionary<string, object> noError = new ConcurrentDictionary<string, object>();
noError.Add("hello", "world");
我最终发现您所要做的就是更改 IL 以将 Add 函数设为私有。
现在本着解耦代码的精神,我很可能会使用接口,但似乎在 Add 方法中找不到并发字典。
真正使用Add是否安全(我无法查看IL,所以我不知道它是否真的是线程安全的。)?或者我应该使用ConcurrentDictionary<TKey, TValue> 的具体类型并明确使用TryAdd。
【问题讨论】:
-
您的标题和实际问题并不相符。 There is no such thing as a non-public member of an interface.
-
@ErikPhilips 不确定链接的相关性。很明显 IDictionary 暴露了 Add,但 Concurrent Dictionary 没有,这意味着它确实实现了接口但功能仍然隐藏。
-
它没有隐藏。您需要了解Implicit Implementation versus an Explicit Implementation 之间的区别。在任何一种情况下,
Add()都已实现并公开。 -
@evanmcdonnal,但它确实存在,它是 documented by microsoft。你有看过吗?
-
@evanmcdonnal 它在你给 LOL 的 href 中列出,它在
Explicit Interface Implementations下。你真有趣。