2014-01-13 4 views
0

В обратный вызов, как это:Кастинг объекта делает его утратившим

this.Model.LoadStudent(student_key, (o, a) => 
          { 
           var student = o as Students; 

Если я ставлю точку останова на первой линии, отладчик показывает мне, что "o" имеет то, что я ищу, а также показывает мне его тип "Students", но как только он переходит к следующей строке и делает литье, результат null. Зачем? Что происходит?

+1

Студенты? во множественном числе? – Steve

+0

http://stackoverflow.com/questions/132445/direct-casting-vs-as-operator –

ответ

6

Вы не заказываете - вы используете оператора as. Если вместо этого фактически литая, я подозреваю, вы получите исключение:

var student = (Students) o; 

я подозреваю, вы на самом деле есть несколько типов, называемых Students, и если вы действительно бросили вместо использования as вы увидите фактический тип.

Например:

using System; 

namespace Bad 
{ 
    class Students {} 

    class Test 
    { 
     static void Main() 
     { 
      object o = new Good.Students(); 
      Students cast = (Students) o; 
     } 
    } 
} 

namespace Good 
{ 
    class Students {} 
} 

Это приводит к:

Unhandled Exception: System.InvalidCastException: 
    Unable to cast object of type 'Good.Students' to type 'Bad.Students'. 
    at Bad.Test.Main() 

Обратите внимание, как вы получаете полностью квалифицированные имена типов в исключения.

В общем, это плохая идея использовать as, если вы действительно ожидать, что объект не может быть правильного типа, и обычно вы проверить, что после этого. См. my blog post on the topic для более подробной информации.

+0

Вы правы Джон, в моем случае фактический тип говорит «System.ServiceModel.DomainServices.Client.LoadOperation'1 [Студенты ] 'и теперь выдает исключение, которое не может передать это «Учащимся» –

+0

Очень интересное сообщение в блоге. Никогда не думал об исключениях, подобных этому раньше. Просто видел их как «Бад **». – TylerD87

3

В этом случае ваш объект не относится к Учащимся. Кастинг таким образом не будет вызывать ошибку, если вы используете неверный тип, он просто сделает объект нулевым.

Смежные вопросы