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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

3回答

3841閲覧

ラムダ式や匿名メソッドについて。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2017/02/18 14:50

###前提・実現したいこと

ラムダ式や匿名メソッドは、デリゲートと合わせて使わなければならないものなのでしょうか?
他の使い方はありますか?
単体で使うことはできませんか?

###試したこと

ラムダ式を単体で使おうと下記のようなコードを書いてみましたが、エラーになりました。

C#

1public class Sample: MonoBehaviour{ 2 3 // Use this for initialization 4 void Start () { 5 () => Debug.Log ("hello!"); 6 } 7}

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

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

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

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

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

guest

回答3

0

Action型かFunc型かdelegate型

実はもうひとつあります。

c#

1public class Sample: MonoBehaviour{ 2 void Start () => Debug.Log("hello!"); 3}

メソッド定義に用いることができます。

投稿2018/11/16 07:23

asm

総合スコア15147

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

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

退会済みユーザー

退会済みユーザー

2018/11/21 03:40

ご回答ありがとうございます。 勉強になりました。 ありがとうございます。
guest

0

ベストアンサー

ラムダ式は型が確定していないので、キャストして呼び出しましょう

csharp

1((Action)(()=>Debug.Log ("hello!")))(); 2

というのも、C#のラムダ式は戻り値を明示的に示す方法がなく、
()=>Debug.Log ("hello!") の戻り値がわかりません。
Debug.Logはvoidを戻すのでわかりそうですが、ラムダ式の内部からは推論しない、というルールがあります。

ではどこで戻り値の型を確定させるか、というとそれを受け取る側からです。
通常はなんらかの変数に代入されて使われるので、その型から戻り値を推論します。

ですから、ラムダ式はvarで受けるとエラーが出ます

csharp

1// エラーが出る 2var func =()=>Debug.Log ("hello!");

戻り値を推論できる型はdelegeteやAction,Funcなんかがあります。

投稿2018/11/16 07:17

izmktr

総合スコア2856

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

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

退会済みユーザー

退会済みユーザー

2018/11/21 03:40

ご回答ありがとうございます。 勉強になりました。 ありがとうございます。
guest

0

一回Action型かFunc型かdelegate型を経由しないといけないですね。以下のコードは実行されます。

C#

1new Action(()=>Debug.Log("hello!"))();

ただC#で即時関数を使うよりもその場で展開する方が関数の生成コストが発生しなくて済むのでクロージャで変数バインドしたい時以外に使うことはほぼ無いように思います。

投稿2017/02/18 15:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/02/18 17:09

ご回答ありがとうございます。 Action型とFunc型は、delegate型の一種という認識で合っていますか? そう認識すると、結果的にdelegate型を経由しないといけないということですか? また、「クロージャで変数バインドしたい時以外に使うことはほぼ無い」の「クロージャ」を調べてみたのですが、よくわからなくて、クロージャとは、{何か処理}、もしくは{引数 -> 何か処理}みたいな形式のものですか? 大雑把に言ってしまうと、ラムダ式や匿名メソッドはdelegate型以外で使うことはほぼ無いということでしょうか?
退会済みユーザー

退会済みユーザー

2017/02/19 03:58

ActionとFuncはC#の標準ライブラリで定義されているクラスで,Action型の変数はvoid型の関数を、Func型の変数は戻り値を持つ関数を格納出来ます。 また、delegateはAction型、Func型にキャスト可能です。 クロージャはそのような表記のことを指すこともありますが、一般的には関数オブジェクト(変数に代入できる関数)を戻り値として返す関数の中で、戻り値として返される関数オブジェクトのことを指します。 これは普通の関数オブジェクトと何が違うのかと言いますとその戻り値として返す関数を返す関数の中で定義されているスコープの変数を共有(バインド)出来ます。(ただしC#には型制約があるのでクロージャを使うにはちょっと工夫が必要です) 説明だけではイメージつかないかもしれないので回答に追記します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問