C# 使用引发NullReferenceException的按钮;我错过什么了吗?

C# 使用引发NullReferenceException的按钮;我错过什么了吗?,c#,windows-8,C#,Windows 8,我收到一个错误对象引用未设置为对象的实例。我想我没有初始化什么东西 这就是代码;如果(btn.Background.Equals(新的SolidColorBrush(Color.FromArgb(0,0,0,0))),则在第行出现错误: 为您提供null,因为按钮是一种引用类型。我猜你想 Button btn = (Button)sender; 您的错误在这里按钮btn=默认值(按钮)。这是将按钮设置为null,因为这是类的默认值 相反,您应该将发送者对象强制转换为按钮,然后验证发送者是否为空

我收到一个错误
对象引用未设置为对象的实例
。我想我没有初始化什么东西

这就是代码;如果(btn.Background.Equals(新的SolidColorBrush(Color.FromArgb(0,0,0,0))),则在第
行出现错误:

为您提供
null
,因为
按钮
是一种引用类型。我猜你想

Button btn = (Button)sender;

您的错误在这里
按钮btn=默认值(按钮)。这是将按钮设置为
null
,因为这是类的默认值

相反,您应该将
发送者
对象强制转换为
按钮
,然后验证
发送者
是否为空(如果事件不是由按钮引发的)


问题是您的发送者是StackPanel,而您正在将其转换为按钮。错了

StackPanel stackPanel = sender as StackPanel;
if(stackPanel != null)
{
        if (stackPanel.Background.Equals(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0))))
        {
            stackPanel.Background = materiaColor;               
            stckTeachersGuideClosed.Visibility = Visibility.Visible;
            stckTeachersGuideOpened.Visibility = Visibility.Collapsed;
        }
        else
        {
            stackPanel.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
        }
}

sender
对象中,您有一个对触发此事件的UI上控件的引用。它属于object类型,但您可以将其强制转换为所需的类型(在本例中,
按钮

因此,获取对按钮的引用,如下所示:

var btn = (Button) sender;
或者,您也可以使用:

var btn = sender as Button;

区别在于,在第一种情况下,如果强制转换不成功,它将抛出一个
InvalidCastException
。在第二种方式中,即使指定的类型不是预期的类型,它也会默默地尝试强制转换它,但当对象被误用时,它会进一步崩溃。

btn为null?你能确定它是正确的控件吗?如果你在那一行设置断点,btn的值是多少?我猜它是空的。可能是@Default的重复。不,它不是重复的。这是一个关于编写代码的特定问题。你的链接是一个一般的理论问题。@Recipe只要看看相关的问题,我就会看到10个标题类似的问题。我链接的那个有最完整的答案(IMO),这就是为什么我标记了那个。也许不是一个完全相同的问题,但是这种问题在这里已经被问过很多次了,只要浏览一下其他问题,OP应该能够解决他的问题。对我来说,另一个“Object reference not set”(对象引用未设置)问题只是给SO增加了一些噪音。他的问题发生在将其初始化为默认值(Button)之前@OleksandrPshenychnyy No,第一个if只是实际行的一个副本,由于格式原因,这一点尚不清楚。在强制转换之前,可能应该检查发送方的类型是否为按钮。如果此事件处理程序绑定到按钮,则不会出现强制转换异常。发送者将始终是按钮。Ok很好错误是fix bot现在我收到另一个错误:无法将类型为“Windows.UI.Xaml.Controls.StackPanel”的对象强制转换为类型为“Windows.UI.Xaml.Controls.Button”。btn始终为send null。但是StackPanel不包含前台的定义。您能在此处发布Xaml以查看具体的内容吗结构是什么?
StackPanel stackPanel = sender as StackPanel;
if(stackPanel != null)
{
        if (stackPanel.Background.Equals(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0))))
        {
            stackPanel.Background = materiaColor;               
            stckTeachersGuideClosed.Visibility = Visibility.Visible;
            stckTeachersGuideOpened.Visibility = Visibility.Collapsed;
        }
        else
        {
            stackPanel.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));
        }
}
var btn = (Button) sender;
var btn = sender as Button;