问题标签 [explicit-interface]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 隐藏方法并在不同接口后面有不同的方法实现是不是一个坏主意?
我有一个当前扩展 IDictionary<> 的接口(以及一个扩展 Dictionary<> 的实现),但我想要一个不允许添加或删除条目的接口的实现(我想允许现有的条目虽然改变了)。我可以采用 ReadOnlyCollection 方法并抛出 NotSupportedException,但这感觉有点不对劲。
相反,我想分解接口,所以我有一个用于访问器位,一个用于更改器位。这一切都很好,只是为了做到这一点,我最终得到了这样的结果(为简洁起见,大多数方法都被删除了):
然后我原来的界面变成了:
一个实现类定义为:
我必须使索引器成为新的,以避免 和 中的索引器之间出现IDictionary
歧义IAccessor
。但真正的问题是设置器索引器在 a 上的行为是Dictionary
在字典中创建一个新条目。因为我希望IAccessor
界面只允许修改条目而不是创建条目,我应该在实现中做什么AttributeDictionary
?我是否应该明确实现IAccessor
索引器方法,该方法首先检查给定键是否在字典中,如果没有则抛出异常,或者拥有 2 个具有不同行为的索引器是个坏主意?或者我应该放弃IAccessor
界面中的索引器而只使用GetValue
andSetValue
方法并避免混淆?
c# - IDisposable 的显式实现
尽管在 SO 上可以找到很多问答IDisposable
,但我还没有找到答案:
我通常遵循这样的做法,即当我的一个类拥有一个IDisposable
对象时,它也会实现IDisposable
并调用Dispose
所拥有的对象。然而最近我遇到了一个IDisposable
明确实现的类,从而阻止我直接调用Dispose
强迫我强制转换它,我觉得这很烦人且不必要。
所以问题是:为什么以及何时要使用 的显式接口实现IDisposable
?我知道明确实现接口有完全好的和正当的理由,但关于IDisposable
原因对我来说不是很清楚。
c# - 为什么在值类型上调用显式接口实现会导致它被装箱?
我的问题与这个问题有些相关:通用约束如何防止使用隐式实现的接口对值类型进行装箱?,但不同,因为它不应该需要约束来执行此操作,因为它根本不是通用的。
我有代码
主要方法编译为:
为什么不编译成这个?
我明白为什么您需要一个方法表来进行虚拟调用,但在这种情况下您不需要进行虚拟调用。如果接口正常实现,则不会进行虚拟调用。
也相关:为什么显式接口实现是私有的?- 关于这个问题的现有答案没有充分解释为什么这些方法在元数据中被标记为私有(而不仅仅是具有不可用的名称)。但即使这样也不能完全解释为什么它被装箱,因为当从 C 内部调用时它仍然装箱。
c# - XML 注释——您如何正确地注释显式实现的接口?
代码:
我的猜测是:
但是,我不确定。ECMA 指南没有帮助区分,所以我想我正在寻找我的猜测是正确的保证。
c# - IXmlSerializable 和 Immutability
我正在IXmlSerializable
一个不可变的类中实现。为了保持类不可变,我显式地实现了接口,以便隐藏方法,并使用ReadXml()
封装方法的静态方法ReadXml(XmlReader reader)
,而是返回我的类的新实例。但是,假设该类被调用ClassA
,我被迫实现的方式IXmlSerializable
意味着该语句
((ClassA)((IXmlSerializable)(ClassAObject)).ReadXml(reader))
实际上改变了ClassAObject
因为,在里面IXmlSerializable.ReadXml
我分配给一个已经创建的对象的参数。那个存在,ClassAObject
还可以被认为是不可变的吗?
c# - 有没有办法通过.NET 中的反射来调用显式实现的方法/属性?
我需要能够确定给定的方法或属性是否来自特定接口并被显式实现。
有没有人这样做过,实际上是否可以通过 .NET 反射获得这些信息?
更新
从接受的答案下方的评论中可以看出,我真正想要完成的事情是调用通过反射实现特定接口的方法。由于可能有多个具有相同方法签名的接口,我想根据接口确定要调用的正确实现。在我的场景中,实现类型、接口和方法名称是在运行时确定的,所以我不能使用简单的转换。
c# - FxCop:CA1033 - Microsoft 的 ReadOnlyCollection 实现违反了这一点?
如果您查看只读集合的代码,它没有“添加”方法,而是定义了该ICollection<T>.Add(T Value)
方法(显式接口实现)。
当我对我的 ReadOnlyDictionary 类做了类似的事情时,FxCop 10 抱怨说我破坏了CA1033。
只读集合类:
那么,这是误报吗?微软的基础代码不好吗?是什么赋予了?
c# - 类型参数“T”与外部类型“...”中的类型参数同名
我收到编译器警告:Type parameter 'T' has the same name as the type parameter from outer type '...'
我试过做:void IFoobar.Foo<U>(int x) { Foo(x); }
,但是我不能保证 U 和 T 是一样的。Foobar 类的实现方式,它们必须相同,这一点非常重要。
我也尝试过这样做:void IFoobar.Foo<U>(int x) where U : T { Foo(x); }
,但这并不能保证 U 和 T 相等,并且它不允许我重新定义约束,因为它是在接口上定义的。
c# - 显式接口实现不能是虚拟的
作为记录,我已经看到了这个连接项目,但我真的不明白支持这个会有什么问题。
假设我有以下代码:
虚拟标识符有什么问题?拥有一个虚拟修饰符可以override
表明基类中有不同的实现。我现在可以通过删除虚拟方法并创建派生类来使其工作,如下所示:
但是这种方式我真的没有任何迹象表明我正在覆盖某些东西。
更新:
根据 C#(部分:20.4.1 显式接口成员实现)规范,有两个原因。
- 隐藏某些方法(我正在使用它)。
- 有 2 个具有相同签名但返回类型不同的函数(例如,对 IClonable 很有用)。
但是,它没有说明为什么不能使这些方法成为虚拟方法。
Update2:
鉴于答案,我认为我应该在这里重新表述真正的问题。如果上述两个原因是首先使接口的显式实现成为可能的原因。如果您将方法设为虚拟,为什么会有问题。
c# - 为什么 VS Metadata 视图不显示显式接口实现的成员
前几天我在看 C# Boolean struct metadata。
Boolean 实现了 IConvertible 接口。但是看着布尔的成员,我看不到大多数 IConvertible 成员。
我与一些同事进行了一些测试,包括创建我们自己的类,并得出结论,IConvertible 必须为 Boolean 显式实现。
问题是,为什么它们不可见?我知道这可能是一个“设计决定”,但我知道如果检查元数据的任何人都可以看到它们,它将增加更大的价值。
测试在 VS2010 .NET4.0 中完成