Понижение общего типа в C # 3.5 - PullRequest
4 голосов
/ 24 октября 2010

Почему я могу использовать только общий, а не понижать?
Почему компилятору не ясно, что если мое ограничение говорит where T : BaseClass, а U получено из BaseClass, то (U)objectOfTypeT допустимо?

Ответы [ 2 ]

5 голосов
/ 24 октября 2010

Потому что это может быть недействительным. Учтите это:

class Base { }
class A : Base { }
class B : Base { }

A temp1 = new A();
B temp2 = (B)temp1; // not valid

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

Обратите внимание, что вы можете обойти это, используя оператор as:

var result = objectOfTypeT as U; // this does not give any compilation error
                                 // but will result in a null reference if
                                 // objectOfTypeT cannot be converted to U
2 голосов
/ 24 октября 2010

Если я не прочитал вопрос неправильно, вы можете получить:

class A:BaseClass{}
class B:BaseClass{}

При T = A и U = B оба ограничения выполняются, но приведение от T к U явно недопустимо.

Если U - просто другой класс, то то же самое все еще применяется; Т, как известно, не находится в той же цепочке, что и U, если вы не указали его в ограничениях (ограничения общего характера могут включать другие аргументы универсального типа, если это помогает).

...