- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个树型类 Foo<T>
及其界面 IFoo<T>
.
我想要 Foo<T>
能够实现IEquatable<Foo<T>>
什么时候T : IEquatable<T>
(或者更一般地说,如果 T : I<T>
我可能想要 Foo<T> : I<Foo<T>>
除了其他已实现的接口(interface))。
我尝试了以下伪代码:
public interface IFoo<T> : IEnumerable<IFoo<T>>
...
public class Foo<T> : IFoo<T>
...
public interface IFooTwo<T> : IFoo<T>, IEquatable<IFooTwo<T>>
where T : IEquatable<T>
...
public class FooTwo<T> : IFooTwo<T> {
... // I implement Equals
public bool NewMethod(FooTwo<T> Other) { ... }
}
所以现在我已经成功实现了Equals
(我还覆盖了通用的 Equals 等)。
但是FooTwo<T>
现在不执行 IEnumerable<IFooTwo<T>>
(相反,它实现了 IEnumerable<IFoo<T>>
)。
所以我有两个问题:
T : IEquatable<T>
我希望能够为 IEquatable<Foo<T>>
实现 Foo<T>
)?一种条件 where
.FooTwo<T>
工具 IEnumerable <FooTwo<T>>
使用 Foo<T> IEnumerable
以快速简便的方式实现?编辑:
在 IEquatable<Foo<T>>
的特殊情况下,我对问题 1 有一个简单的答案。我可以测试是否 T:IEquatable<T>
并更改我对 IEquatable<Foo<T>>
的实现如果需要的话。但是我仍然想知道如何在更一般的情况下做到这一点。
最佳答案
对于问题1,你应该想想你是否真的需要这个。 IEquatable<T>
mostly exists for performance reasons relating to value types .在您的情况下,实际上没有任何理由需要确保您使用的是 IEquatable
等于而不是对象一。例如,这就是 Tuple<T>
做。然后你可以有一个没有约束的单一接口(interface):
public interface IFoo<T> : IEnumerable<IFoo<T>>, IEquatable<IFoo<T>>
对于问题 2,您可能也不需要这个。 IEnumerable<T>
是covariant ,这意味着如果你有一个 IEnumerable<A>
,您可以将其分配给类型为 IEnumerable<B>
的变量,只要A
可以分配给B
.在你的情况下,这意味着如果你有,例如,一个采用 IEnumerable<IFoo<T>>
的方法也将接受 IEnumerable<IFooTwo<T>>
自 IFooTwo<T> : IFoo<T>
但是,如果你想要一个类 MyFoo<T> : IFoo<T>
类型为 IEnumerable<MyFoo<T>>
,没有办法自动执行此操作。这是因为完全有可能有效地实现 IEnumerable<IFoo<T>>
。这也不是 IEnumerable<MyFoo<T>>
的实现.您或许应该将此要求视为一种设计气味并尽量避免它。
关于c# - 我有一个类 A<T> : IEnumerable<T>, 我想添加 IEquatable<A<T>> 如果 T : IEquatable<T>. 我该怎么做并保留 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34634101/
我是一名优秀的程序员,十分优秀!