一种类型可以从自身衍生出来吗?

时间:2009-11-13 18:26:32

标签: c# generics constraints

强制执行通用约束时

class GenericTest
{
    public void Sample<T>(T someValue) where T:Racer,new()
    {
        Console.WriteLine(someValue.Car);
    }
}

T型应该来自Base Type Racer(如果出现任何错误,纠正我)。

public class Racer
    {
        string name;
        string car;
        public Racer() { }
        public Racer(string name, string car)
        {
            this.name = name;
            this.car = car;
        }

        public string Name
        {
            get { return name; }
        }
        public string Car
        {
            get { return car; }
        }

    }

在“Main()”中我执行

static void Main(string[] args)
    {

        List<Racer> rcr = new List<Racer>();
        rcr.Add(new Racer("James","Ferrari"));
        rcr.Add(new Racer("Azar","Bmw"));

        rcr.Sort(delegate(Racer a, Racer b)
        {return a.Name.CompareTo(b.Name); });

        GenericTest tst = new GenericTest();

        tst.Sample<Racer>(rcr[0]);

        Console.ReadLine();

    }

我的问题是:

我实现的约束是where T:Racer,new(),因此应该从Racer派生。 但是在Main()中,我传递了tst.Sample<Racer>(rcr[0]);类型"Racer"。代码正在运行。

Racer如何从Racer派生出来?

5 个答案:

答案 0 :(得分:8)

MSDN:http://msdn.microsoft.com/en-us/library/d5x73970.aspx

  

where T : <base class name>
     type参数必须是或来自指定的基类。

需要注意的一点是必须是或来自。这意味着Racer 派生自Racer的任何类。

答案 1 :(得分:7)

派生是读取此约束的错误方法。它更好地被理解为“可转换为”。这就是Racer在这种情况下工作的原因。

编辑:更多详情

这在C#语言规范的10.1.5节中有所介绍。 ......

  

如果约束是类类型,接口类型或类型参数,则该类型指定用于该类型参数的每个类型参数必须支持的最小“基本类型”。

答案 2 :(得分:5)

您对该约束说的是泛型类型参数T必须是Racer,或者是从Racer下降的类型,而不是它必须只是后代。

答案 3 :(得分:1)

查看它的一种方法是“可以将 T 类型的对象分配给 Racer 引用吗?”

答案 4 :(得分:0)

如果您传入的对象可以强制转换为您在约束上指定的类型,则约束将为true。