gpt4 book ai didi

c# - 我有一个类 A : IEnumerable, 我想添加 IEquatable> 如果 T : IEquatable. 我该怎么做并保留 IEnumerable?

转载 作者:行者123 更新时间:2023-11-30 16:04:44 35 4
gpt4 key购买 nike

我有一个树型类 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>> )。

所以我有两个问题:

  1. 有没有更好的方法来组织我的代码以实现我的目标(如果 T : IEquatable<T> 我希望能够为 IEquatable<Foo<T>> 实现 Foo<T>)?一种条件 where .
  2. 我如何制作 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/

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