转换对象使其变为空

时间:2014-01-13 18:40:54

标签: c# casting action func

在这样的回电中:

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

如果我在第一行放置了一个断点,调试器会告诉我"o"有我正在查找的内容,并且还显示了"Students"的类型,但是只要它转到下一行并且演员阵容,结果是null。为什么?怎么了?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

在这种情况下,您的对象不属于学生类型。如果你转换为错误的类型,以这种方式进行转换将不会抛出错误,只会使对象为空。