C# 通用容器:为什么我需要一个接口?

C# 通用容器:为什么我需要一个接口?,c#,generics,C#,Generics,假设我有以下几点 public interface IInterval<T> { T Start { get; } T Stop { get; } } public class DateTimeInterval : IInterval<DateTime> { private DateTime _start; private DateTime _stop; public DateTimeInterval(DateTime sta

假设我有以下几点

public interface IInterval<T>
{
    T Start { get; }
    T Stop  { get; }
}

public class DateTimeInterval : IInterval<DateTime>
{
    private DateTime _start;
    private DateTime _stop;

    public DateTimeInterval(DateTime start, DateTime stop)
    {
        _start = start; _stop = stop;
    }

    public DateTime Start
    {
        get { return _start; }
    }
    public DateTime Stop
    {
        get { return _stop; }
    }
}

public class SortedIntervalList<T> 
    where T : IInterval<T>, IComparable<T>
{
}
公共接口IInterval
{
T启动{get;}
T停止{get;}
}
公共类DateTimeInterval:IInterval
{
私人日期时间(u start);;
私人日期时间站;
公共日期时间间隔(日期时间开始、日期时间停止)
{
_开始=开始;_停止=停止;
}
公共日期时间开始
{
获取{return\u start;}
}
公共日期时间站
{
获取{return\u stop;}
}
}
公共类分类目录
其中T:i区间,i可比较
{
}
如果我现在尝试实例化容器

var test = new SortedIntervalList<DateTimeInterval>();
var测试=新的SortedIntervalList();
我得到一个编译错误

类型“Test”不能用作泛型中的类型参数“T” 类型或方法
TestContainer
。没有隐式引用 从“测试”转换为
ITest

为什么会这样


编辑历史记录的注意事项

为清楚起见,原始问题的课程包括在下面

public interface ITest<T>
{
    int TestMethod();
}

public class Test : ITest<bool>
{

    public int TestMethod()
    {
        throw new NotImplementedException();
    }
}

public class TestContainer<T> 
    where T : ITest<T>
{ 

}
公共接口测试
{
int TestMethod();
}
公共类考试:ITest
{
公共int TestMethod()
{
抛出新的NotImplementedException();
}
}
公共类测试容器
T:ITest在哪里
{ 
}
其中T:ITest
您的类继承了
ITest
,这不是
T
Test
)的
ITest


正如错误试图告诉您的那样,这不符合您的通用约束,因此您不能这样做。

因为您希望
TestContainer
中的
t
ITest
。那没有道理。我想你的意思是:

public class TestContainer<C, T> 
where C : ITest<T>
{

}
公共类TestContainer
其中C:ITest
{
}

对于问题中的更新代码:

public class SortedIntervalList<C, T> 
    where C : IInterval<T>, IComparable<T>
{ }
公共类SortedIntervalList
其中C:i区间,i可比较
{ }
与:

test=new SortedIntervalList();

我明白了。那么,编译器是否需要为泛型对象的泛型容器定义接口?有没有其他方法来做我想做的事情?“这不是
ITest
”——很清楚,对于一些
T
,它是
ITest
,但不是正确的
T
TestContainer
需要
Test
来实现
ITest
(就像错误消息所说的那样)。@rookie No,编译器不要求您实现接口。您已经在
T
上定义了
Test
类不满足的约束(它必须实现
ITest
)。@rookie:您想做什么?实际上它不应该编译得很好。您应该向
TestContainer
添加一个通用约束,以便它与
ITestContainer
接口上的约束兼容。为什么在接口中从不使用
T
ITest
是通用的?只需将其设置为
公共接口ITest{
,这将解决您的问题(除非您使用
T
,在这种情况下,请更新问题以显示它是如何使用的)。(请同时更新
TestContainer
以显示它在那里的使用方式)@PatrickHofman我不这么认为,更新后的示例仍然存在与您和SLaks答案所解决的相同的潜在问题(在约束中重用t).但我不想启动编辑战,我只是要求您重新阅读它,如果您改变主意,然后回滚。我不同意——我想要类似列表的东西,但必须实现我的接口。@新手是的,如果您想这样做,并且接口是通用的,您必须将两个类型参数传递到
TestContainer
。当前唯一允许进入的是
Test
,因为您在类定义和约束中都使用了
T
。将其与此进行比较:您要求
string
成为
List
。不!当然不是。您希望
C
成为
List
。将
string
替换为
 T
变成了
C:List
@rookie:update your
public class SortedIntervalList
,就像我的回答一样,你会没事的。@Patrickhoffman有没有办法只根据
日期时间间隔
来公开声明?
public class SortedIntervalList<C, T> 
    where C : IInterval<T>, IComparable<T>
{ }
test = new SortedIntervalList<DateTimeInterval, DateTime>();