2009-11-13 2 views
1

При обеспечении более Generic ограниченияМожет ли тип получить от себя?

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

типа Т должен быть получен из базового типа 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(), поэтому T должен быть получен от Racer. But In Main() Я прохожу (tst.Sample<Racer>(rcr[0]);) тип "Racer". Код работает.

Как получить гонщик из гонщика?

ответ

8

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

where T : <base class name>
Тип аргумент должен быть или вывести из указанного базового класса.

Отмечено, что должно быть из. Это означает, что Racer и любой класс, который происходит от Racer.

+0

простой и приятный. – user196546

7

Производится из-за неправильного способа прочитать это ограничение. Лучше читать как «конвертируется в». Вот почему Racer работает в этом сценарии.

EDIT: Подробнее

Это описано в разделе 10.1.5 в C# языка спецификации. ...

Если ограничение представляет собой тип класса, тип интерфейса или параметр типа, этот тип указывает минимальный «базовый тип», который должен поддерживать каждый аргумент типа, используемый для этого параметра.

+0

«конвертируется в« не »точно * лучший способ подумать об этом. –

+0

@Martinho, согласился, что это не идеально, но это несколько упрощенный способ думать об этом. – JaredPar

5

То, что вы говорите с этим ограничением является то, что общий тип аргумента T должен быть Racer, или тип, который спускается с Racer, не то, что он должен быть только потомок.

0

Ограничение было бы истинным, если объект, который вы передаете, может быть перенесен в тип, указанный вами для ограничения.

1

Один из способов посмотреть на него это «Может ли объект типа T быть назначен Racer ссылки?»