gpt4 book ai didi

c# - 无法引发事件

转载 作者:行者123 更新时间:2023-11-30 21:45:16 25 4
gpt4 key购买 nike

我正在尝试完成给定的作业,但我没有这样做。我写了一个产品类并用它做了一朵花。然后我想在鲜花数量低于 20 时引发一个事件,它应该给我一个警告。我想我在发起这个事件时遇到了困难。我确定我对委托(delegate)和事件的声明是正确的,但缺少一些东西。先感谢您。

这一行

flower.StockDecreased();  

给我这个错误:

Error   3   The event 'StokTakip.Product.StockDecreased' can only appear on the left hand side of += or -= (except when used from within the type 'StokTakip.Product')  


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StokTakip
{
class Program
{
static void FlowerStockDecreased()
{
Console.WriteLine("Flower stock decreased");
}

static void Main(string[] args)
{
Product flower = new Product("Flower", 50);
Console.WriteLine(flower);

flower.StockDecreased += new Product.FlowerEventHandler(FlowerStockDecreased);

while (true)
{
Console.WriteLine("What is your choice");
Console.WriteLine("[1] Stock entry quantity ");
Console.WriteLine("[2] Stock exit quantity: ");

int choice = Convert.ToInt32(Console.ReadLine());

if (choice == 1)
{
Console.Write("Enter stock entry quantity: ");
flower.quantity += Convert.ToInt32(Console.ReadLine());

}

else if (choice == 2)
{
Console.Write("Enter stock exit quantity: ");
flower.quantity -= Convert.ToInt32(Console.ReadLine());
}

Console.WriteLine(flower);

if (flower.quantity<20)
{
flower.StockDecreased(); //????

}
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StokTakip
{
public class Product
{
public string name;
public int quantity;

public Product(string a, int m)
{
name = a;
quantity = m;
}

public override string ToString()
{
return "Name: "+ this.name + " Stock Quantity: " + this.quantity;
}

public delegate void FlowerEventHandler();
public event FlowerEventHandler StockDecreased;
}

最佳答案

错误信息很清楚。你不能引发这样的事件。只有声明类才能像这样调用事件并引发事件。所有其他类只能从事件中添加 (+=) 或删除 (-=) 事件处理程序。

您可以将一个公共(public)方法放入引发事件的 Product 类中,如下所示:

public void RaiseStockDecreased()
{
if (StockDecreased != null)
StockDecreased();
}

您可以在外部调用它。

但是话又说回来,这与正确的设计相矛盾,因为我希望 Product 类本身确定库存是增加还是减少并引发正确的事件。否则,您必须在每个想要收到库存变化通知的地方实现该逻辑。

关于c# - 无法引发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40342222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com