質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

904閲覧

「引数を含む別の関数」を引数とした関数を使う方法

FujiBayashi

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/10/01 11:20

前提・実現したいこと

別の関数を引数とした関数を使うには、どのように記述すればよいでしょうか?
下記の試したコードでは無数のエラーが発生し、「これではない」ということは解るのですが、
調べても「別の関数を引数とした関数を使う方法」は出てくるのですが
「引数を含む別の関数を引数とした関数を使う方法」については調べることができませんでした。

大変基本的なことで申し訳ありませんが、よろしくお願いいたします。

該当のソースコード

TestMethod_OneからTestMethod_Two経由でTestMethod_Threeを実行したいのですが、
TestMethod_Threeは引数(int b)を含めた形で実行したいと考えています。

C#

1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class Test : MonoBehaviour 7{ 8 int a = 0; 9 10 void TestMethod_One() 11 { 12 TestMethodTwo(a, () => TestMethodThree(a)); 13 } 14 15 void TestMethod_Two(int b, Action MethodName(b)) 16 { 17 MethodName(b); 18 } 19 20 void TestMethod_Three(int i) 21 { 22 Debug.Log(i); 23 } 24}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/10/01 11:29

関数を引数にしたいのか、関数を呼び出した結果を引数にしたいのか? 前者であれば、引数にするのは関数自体なので、その関数に引数はありません。 「関数」と「関数の呼び出し」をちゃんと区別しましょう。
guest

回答2

0

ベストアンサー

UnityではなくC#/.NET Frameworkのコンソールアプリケーションでのサンプルですが、問題の事情は同じだと思います。

  • メソッド名が間違っています。_が入っていなかったりします。
  • ラムダ式に間違いがあります。
  • Actionの引数宣言の間違いです。

C#

1using System; 2 3namespace ConsoleApp1 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 var obj = new Program(); 10 obj.TestMethod_One(); 11 } 12 13 //int a = 0; 14 int a = 123; 15 16 void TestMethod_One() 17 { 18 // メソッド名とラムダ式に間違い 19 //TestMethodTwo(a, () => TestMethodThree(a)); 20 TestMethod_Two(a, (a) => TestMethod_Three(a)); 21 } 22 23 // 宣言、定義の間違い 24 //void TestMethod_Two(int b, Action MethodName(b)) 25 void TestMethod_Two(int b, Action<int> MethodName) 26 { 27 MethodName(b); 28 } 29 30 void TestMethod_Three(int i) 31 { 32 // UnityではDebug.Log()が使えるけど、 33 // Unityではないから別のクラスメソッドに置き換え 34 //Debug.Log(i); 35 System.Diagnostics.Debug.WriteLine(i); 36 Console.WriteLine(i); 37 } 38 } 39}

これを実行するとデバッグ端末とターミナルに123と出力されます。

投稿2021/10/01 12:04

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FujiBayashi

2021/10/01 12:50

詳細に回答いただきありがとうございました! こちらで気付きがあり、Actionに<>がないことが原因だと判明しました。 次のような形で解決いたしました。ありがとうございました!! using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { int a = 0; void TestMethodOne() { TestMethodTwo(TestMethodThree, a); } void TestMethodTwo(Action<int> MethodName, int b) { MethodName(b); } void TestMethodThree(int i) { Debug.Log(i); } }
guest

0

https://www.delftstack.com/ja/howto/csharp/how-to-pass-a-method-as-a-parameter-in-csharp/
これが参考になると思います
c# メソッド 渡す
でググりました

投稿2021/10/01 11:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問