• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

델리게이트(Delegate)부터 람다식(Lambda)까지 듣고 궁금한게 있어서 질문드립니다

20.11.11 15:44 작성 조회수 411

0

    class Program

    {

        static List<Item> _items = new List<Item>();

        static Item FindItem(Action<Item> selector1)

        {

            foreach (Item item in _items)

            {

                if (item.itemType == ItemType.Weapon)

                    return item;

            }

            return null;

        }

 

        static Item FindItem2(Func<Item, bool> selector2)

        {

            foreach (Item item in _items)

            {

                if (item.itemType == ItemType.Armor)

                    return item;

            }

            return null;

        }

 

        static void Main(string[] args)

        {

            _items.Add(new Item() { itemType = ItemType.Weapon, rarity = Rarity.Normal });

            _items.Add(new Item() { itemType = ItemType.Armor, rarity = Rarity.Uncommon });

            _items.Add(new Item() { itemType = ItemType.Ring, rarity = Rarity.Rare });

            Item item = FindItem((Item item) => { Console.WriteLine("Find Weapon"); });

            Item item2 = FindItem2((Item item) => { return 1 < 10; });

        }

    }

강의때 작성해주신 코드를 따라해보다가 조금 다르게 바꿔보았는데 해당 코드에서 람다 형식으로 작성한 델리게이트 함수를 실행 하기 위해 selector1(); 또는 selector2(); 작성 시에 정식 매개변수 'arg'에 해당하는 제공된 인수가 없다는 알람이 나옵니다.

Console.Write 함수를 출력하기 위해서는 어떤식으로 작성해야 하며 return true 값을 반환하여 변수에 담을려면 어떻게 작성해야 하는지 알려주실수 있으신가요?

답변 2

·

답변을 작성해보세요.

0

astrape님의 프로필

astrape

질문자

2020.11.12

안녕하세요 강사님 덕분에 해결되었습니다.

selector();로 해서 람다식이 실행되지 않아서 질문드렸는데 그대로 사용하면 안되고 selector.Invoke(); 를 사용해서 해당 함수를 실행 시켜야 되는거였네요 

답변주셔서 감사드립니다

0

Action<Item> selector1
이라면 람다 형식이나 함수 형식을
- Item을 인자로 받고, 아무것도 return하지 않는 함수

Func<Item, bool> selector2
이라면 람다 형식이나 함수 형식을
- Item을 인자로 받고, bool을 return하는 함수

로 만들어서 넘겨야 합니다.

그래서 FindItem 예시에서는 console 출력만 하고 아무것도 return하지 않았고
FindItem2에서는 return true; 를 해준 것이죠.

어떻게 고치셔서 에러가 났는지를 올려주셔야 정확히 답변을 드릴 수가 있겠지만
'arg'에 해당하는 제공된 인수가 없다는 알림은 위의 양식을 지키지 않아서일 것 같네요.
그리고 Console.Write는 위의 내용과 아무런 상관이 없습니다.
return true 값을 반환하여 변수에 담을려면
이 부분은 어떤 부분을 질문 주시는건지 헷갈리는데
Func<Item, bool> selector2 의 bool을 의미하는 것이라면

bool result = selector2.Invoke(item);
이런 식으로 정말 bool을 반환한다고 생각하고 만들면 됩니다.
아무튼 그래도 헷갈리는 부분이 있으시다면
고쳐서 에러가 난 문제의 코드를 다시 올려주시기 바랍니다.