0

如果我注释掉我的静态类,这编译得很好。但是我想让静态类正常工作,这样我就可以使用 main.js 中第一个注释掉的行。我的错误是

错误 CS0314:类型“T”不能用作泛型类型或方法“DateTest.Range”中的类型参数“T”。没有从“T”到“System.IComparable”的装箱转换或类型参数转换。

我的来源是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DateTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Range.Create(new DateTime(2013, 1, 1), new DateTime(2015, 1, 1), s => s.AddYears(1));
            new Range<DateTime>(new DateTime(2013, 1, 1), new DateTime(2015, 1, 1), s => s.AddYears(1));
        }
    }
    static class Range { public static Range<T> Create<T>(T s, T e, Func<T,T> inc) { return new Range<T>(s, e, inc); } }
    class Range<T> : IEnumerator<T> where T : IComparable 
    {
        T start, pos, end;
        Func<T,T> inc;
        public Range(T s, T e, Func<T,T> inc) { pos=start= s; end = e; this.inc = inc; }

        public T Current
        {
            get { return pos; }
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }

        object System.Collections.IEnumerator.Current
        {
            get { return pos; }
        }

        public bool MoveNext()
        {
            pos = inc(pos);
            return pos.CompareTo(end) != 0;
        }

        public void Reset()
        {
            pos = start;
        }
    }
}
4

1 回答 1

3

您的静态Create方法需要具有Range<T>类应用于通用参数的所有约束:

static class Range
{
    public static Range<T> Create<T>(T s, T e, Func<T, T> inc)
        where T : IComparable  //this line was added
    {
        return new Range<T>(s, e, inc);
    }
}

就这样。

由于Range类需要T具有可比性,因此该Create方法需要确保其自身T也具有可比性。

附带说明一下,您可以考虑使用IComparable<T>as 作为两者的约束,而不是IComparable,以确保比较的静态类型。

约定还会声明Range实现,IEnumerable<T>而不是IEnumerator<T>让多个源同时迭代相同的范围,并且它还允许您在foreach循环中使用该类型以及构建在其上的许多其他库方法(即所有 LINQ)IEnumerable<T>界面。

于 2013-08-08T18:04:12.307 回答