Mam nadzieję, że pytanie jest poprawne, przedstawmy więc przykład. Wyobraźmy sobie następującą metodę Generic:Dlaczego VS ostrzega mnie, że typeof (T) nigdy nie jest typem podanym w ogólnej metodzie, w której parametr typu jest ograniczony do implementacji T?
public abstract class Base : IDisposable
{
public static IEnumerable<T> GetList<T>()
where T : Base
{
// To ensure T inherits from Base.
if (typeof(T) is Base)
throw new NotSupportedException();
// ...
}
}
Według MSDN słowo kluczowe where
ogranicza parametr typu T
być typu Base
lub dziedziczą z tej klasy.
[...] A gdzie punkt może zawierać wiązanie klasy bazowej, w którym stwierdza się, że muszą mieć do określonej klasy jako klasa podstawy (albo być tego samego klasy) w celu użycia jako typ argument dla tego rodzaju generycznego.
Również ten kod nie kompilacji:
public static T GetFirst()
where T : Base
{
// Call GetList explicitly using Base as type parameter.
return (T)GetList<Base>().First();
}
więc kiedy po ostatnim Kod typeof(T)
powinien powrócić Base
, nie powinna? Dlaczego program Visual Studio drukuje to ostrzeżenie?
ostrzeżenie CS0184: Podane wyrażenie nigdy nie należy do podanego typu ("Demo.Base").
Co chcesz zrobić? Zapewnienie, że 'T' dziedziczy z' Base' jest bezużyteczne, ponieważ ogólne ograniczenie już to zapewnia. – CodesInChaos
Ograniczenie zapewnia, że 'T' dziedziczy po' Base' ** LUB ** jest samym 'Base'. Chcę, aby 'T' dziedziczył po' Base'. – Carsten