Общий подтип определения типа не отражает как таковой - PullRequest
3 голосов
/ 29 июня 2011

Дано

public class Generic<T> {}
public class SubGeneric<T> : Generic<T> {}

Все следующее ложно:

typeof(Generic<>).IsAssignableFrom(typeof(SubGeneric<>));
typeof(SubGeneric<>).IsSubclassOf(typeof(Generic<>));
typeof(SubGeneric<>).BaseType.Equals(typeof(Generic<>));

Первое имеет смысл (до тех пор, пока они не будут назначены)Но почему это поведение на двух других?

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

SubGeneric<T> наследует Generic<T>, а не Generic<>

Если бы он унаследовал Generic<>, он не передал бы достаточно информации.
Рассмотрим разницу между

class Wierd<T1, T2> : Generic<T1> { }

и

class Wierd<T1, T2> : Generic<T2> { }

или даже

class Wierd<T1, T2> : Generic<Wierd<T2, T1>> { }

BaseType включает конкретную параметризацию базового типа.

typeof(SubGeneric<>).BaseType.GetGenericArguments() вернет массив, содержащий параметр общего типа SubGeneric<> (<T>).


typeof(SubGeneric<>).BaseType.GetGenericTypeDefinition() == typeof(Generic<>);

должно быть правдой.

1 голос
/ 29 июня 2011

Я думаю, что эти утверждения не имеют смысла, пока не будет дано T.

SubGeneric<T> является подклассом Generic<T>, но SubGeneric<> и Generic<> (без каких-либо T) вообще не являются классами и не могут наследовать одно от другого, или это может означать, что любой SubGeneric<U> может быть подклассом Generic<V>, что, очевидно, неверно.

0 голосов
/ 29 июня 2011

Я думаю, что это связано с универсальным параметром.

SubGeneric<string> не является подклассом Generic<int>

Так что, не зная об общем параметре, сделать вывод нельзя.

typeof(SubGeneric<int>).IsSubclassOf(typeof(Generic<int>));
typeof(SubGeneric<string>).BaseType.Equals(typeof(Generic<string>));

должен вернуть true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...