C#未处理的异常:System.NullReferenceException:未将对象引用设置为对象的实例

时间:2013-03-05 07:34:43

标签: c# casting nullreferenceexception gettype

您好,我在理解为什么这段代码时遇到了问题:

using System;

class Person
{
    public Person()
    {
    }
}


class NameApp
{
    public static void Main()
    {
        Person me = new Person();
        Object you = new Object();

        me = you as Person;
        //me = (Person) you;

        System.Console.WriteLine("Type: {0}", me.GetType()); //This line throws exception
    }
}

引发此异常:

未处理的异常:System.NullReferenceException:未将对象引用设置为对象的实例。    at NameApp.Main()in C:\ Users \ Nenad \ documents \ visual studio 2010 \ Projects \ Exercise 11.3 \ Exercise 11.3 \ Program.cs:line  21

8 个答案:

答案 0 :(得分:2)

你的行

me = you as Person;

失败并将null赋给me,因为您无法将基类类型对象强制转换为子类。

as (C# Reference)

  

as运算符就像一个强制转换操作。但是,如果转换   是不可能的,因为返回null而不是引发异常

您可能希望将person转换为object,因为meObject,但you不是人。

答案 1 :(得分:2)

此代码始终将me设置为空

   Object you = new Object();
   me = you as Person;

因为Obejct 不是

但是人是object

object you = new Person();
me = you as Person;

答案 2 :(得分:1)

Object you = new Object();
me = you as Person;

you是一个对象,而不是一个Person,因此you as Person将只返回null。

答案 3 :(得分:1)

me = you as Person;

me null如果you无法投放到Person(这就是您所处的情况,因为new Object()无法投放到Person 1}}。

答案 4 :(得分:1)

如果对象不是您请求的类型,则as运算符返回null。

me = you as Person;

你是一个Object,而不是一个Person,所以(你作为Person)是null,因此我是null。之后你在我身上调用GetType()时,你会得到一个NullReferenceException。

答案 5 :(得分:1)

public static void Main()
{
    Person me = new Person();
    Object you = new Object();

    // you as person = null
    me = you as Person;
    //me = (Person) you;

    System.Console.WriteLine("Type: {0}", me.GetType()); //This line throws exception
}

答案 6 :(得分:1)

无法将对象强制转换为Person。 它是面向对象编程的原理。

Object是Person的父类。 每个类都继承它,

您可以将Person转换为Object,但不能将Object强制转换为Person

答案 7 :(得分:1)

如果使用as关键字进行投射并且无法投射,则会返回null。 然后,在您的情况下,您此时调用me.GetType() menull,因此会抛出异常。

如果您像(Person) objectOfTypeThatDoesNotExtendPerson一样投射,则会立即抛出异常。