强制执行通用约束时
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派生出来?
答案 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。