【发布时间】:2014-08-23 18:13:42
【问题描述】:
目标:
创建由实现另一个特定通用接口的类型参数化的通用接口。
问题:
我正在尝试用 C# 编写以下相关接口,但我无法确定我正在尝试做的事情是否可行。
public interface IVersion<T>
{
IVersionManager<IVersion<T>> Parent { get; }
// various other methods
}
public interface IVersionManager<T> where T : IVersion<T>
{
IReadOnlyList<T> Versions { get; }
T Current { get; }
void AddVersion(T version);
// various other methods
}
不幸的是,Visual Studio 似乎发现 IVersion<T> 界面中的自引用 (IVersionManager<IVersion<T>>) 相当令人反感。
它会抛出以下错误:
类型“
IVersion<T>”必须可转换为“IVersion<IVersion<T>>” 为了将其用作通用接口中的参数“T” 'IVersionManager<T>'
这听起来好像是圆形的,但我不认为它实际上是。
这对我来说很有意义。我疯了吗?这可能吗?我只是希望子版本能够引用它的父管理器。
Google 搜索没有找到任何东西。我怀疑也许我只是不知道如何表达这个问题。
【问题讨论】:
-
感谢您建议使用不同的变量名。我在任何地方都使用 T 隐藏了我在 IVersionManager 中确实有循环引用的事实。嗯....
-
T在你的IVersion界面中应该代表什么?它应该是经理,不同的版本,还是别的什么? -
坦率地说,这并不重要。说它是字符串或整数。
-
你要避免在你的课程中设计这样的循环——它们很快就会咬你。
-
好的,这有帮助,所以关于在
IVersion接口上约束T的答案不适用。
标签: c# generics interface containers restriction