C# - Как передать список <T>делегату в качестве параметра - PullRequest
1 голос
/ 29 января 2020

По сути, я пытаюсь создать делегата, которому я хочу передать функцию методу, который возьмет список объектов продукта и выполнит определенные вычисления.

К сожалению, я получаю сообщение об ошибке

main.cs (11,40): ошибка CS0120: ссылка на объект требуется для доступа к элементу c не-stati `MainClass.MyDelegate (System.Collections.Generi) c .List) 'Ошибка компиляции: 1 ошибка (ов), 0 статусов выхода компилятора предупреждений 1

Мой вопрос: почему я пытаюсь передать список делегату - что я не так?

Спасибо и всего наилучшего


using System;
using System.Collections.Generic;
using System.Collections;

class MainClass {
  public static void Main (string[] args) {
    Console.WriteLine ("Hello World");
    MyCart MyBasket =  new MyCart();
    MyBasket.Initialize();
    //Console.WriteLine(MyBasket.basket.Count);
    MyBasket.BuyItem("Iphone", 300.3m, MyDelegate );
  }

  public void MyDelegate (List<Product> e){
    // this is where i am performing my delegate
    if (e.Count > 2)
    {
      Console.WriteLine($"This is delegate Talking our current Cart has more than 2 items inside, in fact the count is  {e.Count}");
    }
    else

    {
      Console.WriteLine($"This is delegate Talking our current Cart has less than 2 items inside, in fact the count is  {e.Count}");
    }
  }
}

public class MyCart
{
//public delegate void ObjectCheck(List<Product> basket) ;

public List<Product> basket = new List<Product>();
public delegate void ObjectCheck(List<Product> basket) ;
public void Initialize (){
  // this is our Cart Class constructor
  basket.Add(new Product { ItemName = "Book", ItemPrice = 4.9m });
  basket.Add(new Product { ItemName = "Milk", ItemPrice = 3.5m });
}

public void BuyItem (string i, decimal p, ObjectCheck mymethod)
{
  basket.Add(new Product {ItemName = i, ItemPrice = p});

  mymethod(basket);

}
}

1 Ответ

1 голос
/ 29 января 2020

Эта ошибка возникает из-за того, что MyDelegate - это метод экземпляра (без ключевого слова static), и он используется в контексте static (Main). Чтобы исправить ошибку, вам нужно объявить MyDelegate следующим образом:

public static void MyDelegate (List<Product> e)
{
    // do some stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...