To dość zastanawiające, aby przekonać się, że ograniczenia rodzajowe nie mogą zostać przeniesione do jego typu pochodnego.Dlaczego nie można przenosić własności generycznych na ograniczenie generyczne?
Powiedzmy mam następujący kod:
public abstract class BaseClass
{
public int Version
{ get { return 1; } }
public string FixString { get; set; }
public BaseClass()
{
FixString = "hello";
}
public virtual int GetBaseVersion()
{
return Version;
}
}
public class DeriveClass: BaseClass
{
public new int Version
{ get { return 2; } }
}
I wiecie co, ta metoda zwróci błąd kompilacji:
public void FreeConversion<T>(T baseClass)
{
if(baseClass.GetType()==typeof(DeriveClass)
var derivedMe = (DeriveClass)baseClass;
}
musiałbym rzucić baseClass
do object
pierwszy przed I może obsłużyć go do DerivedClass
, tj.
public void FreeConversion<T>(T baseClass)
{
if(baseClass.GetType()==typeof(DeriveClass)
var derivedMe = (DeriveClass)((object)baseClass);
}
Wydaje mi się dość brzydka. Dlaczego tak się dzieje?
Dlaczego kompilator nie może o tym wiedzieć? Myślałem, że powinien wiedzieć, ponieważ wyraźnie określić, że 'DeriveClass' jest dziedziczone klasy dla' BaseClass' – Graviton
@ Nu: Nie, nie. Możesz * przetestować *, aby zobaczyć * jeśli * 'T' jest typu' DeriveClass', a następnie - * niezależnie od testu * - próbujesz jawnie rzucić 'T' na' DeriveClass'. Pamiętaj, że kompilator nie * uruchamia * twojego kodu - po prostu * kompiluje *. Co można zrobić, jest konwertowane za pomocą klauzuli "as" zamiast jawnej obsady. 'baseClass as DeriveClass' zwróci instancję jako' DeriveClass' jeśli to możliwe, i 'null' inaczej, ale jeśli sprawdzisz, czy jest to możliwe jako pierwsze (jak teraz), to wiesz (nawet jeśli twój kod nie zawiera), że będzie nigdy nie powinno mieć wartości "null". –
@Ngu Kompilator nie może wiedzieć, ponieważ nikt nie może wiedzieć! Gdy szablon jest tworzony, nie ma nic do powiedzenia, że kiedykolwiek otrzyma tylko parametr BaseClass i na pewno nic nie powie, że będzie to wartość DerivedClass. Nie ma na przykład nic, co mogłoby powstrzymać kogoś nazywającego "FreeConversion (42)". Jedynym wyjątkiem jest metoda członkowska szablonu ograniczonego do wyprowadzenia z własnego parametru (w niektórych przypadkach przydatna). –