“this"指的对象实际上并不是使用“this”的对象

本文关键字:对象 this 并不是 实际上 quot | 更新日期: 2023-09-27 18:17:32

在调试时,我的程序崩溃了,错误指出存在一个空引用。奇怪的是,在它崩溃的那一行,它在一个不同的静态类中运行一个方法,其中一个参数填充了"this",这应该意味着它正在喂养正在进行调用的对象,但是当我将鼠标悬停在"this"上时,它不是调用对象,而是一个完全不同的类类型的对象。

有没有人知道或有任何形式的解释,如何使用"this"可能有"this"是一个对象,甚至不是同一类型的调用类?

这就是所讨论的方法。

public void UpdateLight()
    { DoUpdateLight(); }
    protected virtual void DoUpdateLight()
    {
        if (isActive)
        {
            Systems.Lighting.Instance.SetSpotLight(
                this,
                (int)(owner.GetEyeHeight - owner.GetHeight * 0.25f),
                lightRange,
                owner.visionAngleHorizontal,
                owner.visionAngleVertical,
                owner.GetGridNumber,
                owner.parentFloor.floorLevel,
                lightStrength,
                lightDecay,
                lightMaxTiles,
                800);
            RemoveLights();
            litObjectsPrev = litObjects;
            litObjects = new List<ILightable>();
        }
    }

“this"指的对象实际上并不是使用“this”的对象

回答你的问题:

有没有人知道或有任何形式的解释,如何使用"this"可能有"this"是一个对象,甚至不是同一类型的调用类?

是的。this不一定是类本身。这可能是因为遗传。这意味着this的类型实际上是它的子类型。

考虑运行下面的代码片段(控制台应用程序):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace thisSample
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass b = getClass("Child");
            b.SayHelloAndMyType();
        }
        static BaseClass getClass(string name)
        {
            BaseClass returnValue = null;
            switch (name)
            {
                case "Base":
                    returnValue = new BaseClass();
                    break;
                case "Child":
                    returnValue = new ChildClass();
                    break;
                default:
                    returnValue = new BaseClass();
                    break;
            }
            return returnValue;
        }
    }

    class BaseClass
    {
        private const string NAME = "Base class";
        public virtual string GetName()
        {
            return NAME;
        }
        public virtual void SayHelloAndMyType()
        {
            Console.WriteLine("Hello from " + this.GetName() + " and my type is " + this.GetType().ToString()); //this.GetName() could be "Base class" or not. Depending on what instance it really is "this" (Base or Child)
        }
    }
    class ChildClass : BaseClass
    {
        private const string NAME = "Child class";
        public override string GetName()
        {
            return NAME;
        }
    }
}

现在,至于为什么你的应用程序崩溃,因为NullReferenceException,它只能回答,如果有一个堆栈跟踪,在哪里抛出的异常