通用约束不适用

时间:2015-11-24 16:48:24

标签: c# .net generics interface

我有很多类型的IWorkingPattern界面......

public interface IWorkingPattern
{
    TimeSpan Start { get; }

    TimeSpan End { get; }
}

我希望能够将字典中的这些内容转换为Timeslot的数字......

public class Timeslot
{
    public Timeslot(DateTime start, DateTime end)
    {
    }
}

为实现这一目标,我编写了以下通用助手方法......

public IEnumerable<Timeslot> ToTimeslots<T>(IEnumerable<KeyValuePair<DateTime, IEnumerable<T>>> datePatterns)
        where T : IWorkingPattern
    {
        Collection<Timeslot> timeslots = new Collection<Timeslot>();

        foreach (KeyValuePair<DateTime, IEnumerable<T>> datePattern in datePatterns)
            foreach (IEnumerable<T> pattern in datePattern.Value)
                timeslots.Add(new Timeslot(datePattern.Key + pattern.Start, datePattern.Key + pattern.End));

        return timeslots;
    }

但是,在尝试完成时,我为每个StartEnd属性收到2个错误:

  

&#39; System.Collections.Generic.IEnumerable&#39;不包含&#39; XXX&#39;的定义没有扩展方法&#39; XXX&#39;接受类型为'System.Collections.Generic.IEnumerable&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

我可以通过在第二个foreach循环中转换每个pattern来实现这一点(例如:((IWorkingPattern)pattern).Start。但是我确定我不应该因为接口约束而这样做。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

foreach (IEnumerable<T> pattern in datePattern.Value)

此代码可能不正确,因为您已经知道datePattern.ValueIEnumerable<T>的{​​{1}}。

虽然我没有测试过,但我怀疑这应该是

foreach

答案 1 :(得分:0)

您正试图在IWorkingPattern IEnumerable T T IWorkingPattern IWorkingPattern foreach (var pattern in datePattern.Value) {{1}}上使用{{1}}的属性。如果要访问集合中每个{{1}}的属性,则必须正确枚举它。例如:

{{1}}

另外,为什么在限制为一个接口的情况下制作通用方法?