質問するログイン新規登録
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

2914閲覧

c#:Func<IEnumerable<T>,bool> 値をセットしたいとき

mahry

総合スコア37

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/03/04 06:23

編集2020/03/04 08:01

0

0

前提・実現したいこと

Funcの動きについて学んでいる最中です。
指導者に用意して頂いたFuncの使い方の中に、タイトルのように

C#

1Public Func<IEnumerable<IItem>,bool> itemProcessor {get;set;}

というものがあり、
Func<T,TResult> 代理人
を参考に見ていたのですが、itemProcessorに値をセットするとき、
IEnumerable<IItem> でセットすると思っていたのですが、
IEnumerable<IItem>をFunc<IEnumerable<IItem>,bool>に暗黙的に変換できない
としてエラーが出てしまいました。
これはなぜなのでしょうか?

私がFuncを理解しきれていないため、見当違いなことを言っていたらすみません。
もしFuncの動きについて、みなさんの知る限りもっともわかりやすいサイト等があれば教えていただきたいです。

不足している情報があればご指摘ください。

補足情報(FW/ツールのバージョンなど)

Visual studio 2019

追記

itemProcessorにセットするものを値だと思い込んでいました。関数ですね。
ご指摘頂いた皆さん、ありがとうございました。
引数はインタフェースなのですが、あとはこれを引数に持ち、boolを戻り値とする関数を考えます。
インタフェースを引数に持つ場合どう書くのか見当つきませんが、
とにかくみなさんありがとうございました!

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

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

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

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

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

dodox86

2020/03/04 06:45

> Public Func<IEnumerable<IItem>,bool> itemProcessor {get;set;} ??C#でしょうか? VB.NETと混ざっていませんか。Publicと言うキーワードはC#にはないはずです。publicはあります。また、IItem(おそらくinterfaceだと思いますが)の宣言と併せ、実際にエラーになった具体的なコードをご提示ください。
papinianus

2020/03/04 06:54

itemprocessorは値ではなく、複数の値を処理するプログラムをセットします。指導者さんに再確認してみては?
mahry

2020/03/04 07:59

>> dodox86 さん publicでした。先頭小文字です。失礼いたしました。 値をセットするものだと思っていましたが、ほかの方からのご指摘で関数をセットすることに気が付きました。すみません。 >> papinianus さん 関数をセットするということが失念していました。ご指摘ありがとうございます。あとはインタフェースを引数に持ちboolを戻り値とする関数をセットする方法を考えます。ありがとうございました。
guest

回答3

0

ベストアンサー

こんにちは。

そのプロパティの型は Func<IEnumerable<IItem>, bool> ですね。
IEnumerable<IItem>Func<IEnumerable<IItem>, bool> は、見ての通り違う型なので、当たり前ですがセットすることは不可能です。
例えば intstring を代入しようとしているのと同じことです。

ところで、「Func」の名前は「Function」から来ています。
つまり、Func<IEnumerable<IItem>, bool> とは、
IEnumerable<IItem> を引数に取って、bool を返す "関数"」
なのです。

値ではなく、「関数」をセットしてください。

イメージさえできれば使い方は難しくないので、ドキュメントをもう一度読み直しつつ理解するのが良いです。
それでも分からなければ、指導者の方に直接ヘルプを頼んだ方が良いです。

投稿2020/03/04 07:15

tamoto

総合スコア4346

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

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

mahry

2020/03/04 07:28

ものすごくわかりやすかったです! IEnumerable<IItem>を返すとずっと思っていたので、関数のことが頭から抜けてました。 ドキュメントを再読し学習を進めたいと思います。 ありがとうございました!
mahry

2020/03/04 07:56

すみません、 「IEnumerable<IItem> を引数に取って、bool を返す "関数"」 ということなのですが、 private bool Fanctionitem (IEnumerable<IItem> item){ return true; }; これをitemProcessor = Fanctionitemと書くということでしょうか?
mahry

2020/03/04 08:05

すみませんがまだ疑問点が解消できていなかったためベストアンサーを外させていただきます。失礼しました。
tamoto

2020/03/04 08:05

はい。それで動きます。 Func のような関数を入れられるプロパティには、即席で作った関数を書くことも多く、「ラムダ式」で調べてみると、新しい関連知識が得られると思います。
mahry

2020/03/04 08:14

すみません、この関数を itemProcessor = Fanctionitem と書いたところ 型 'bool' を 'System.Func<System.Collections.Generic.IEnumerable<IItem>, bool>' に暗黙的に変換できません と出てしまいました。 もう少しやってみます。ご丁寧にありがとうございました。
tamoto

2020/03/04 08:17

Fanctionitem を「呼び出し」ていませんか? itemProcessor には関数そのものを渡してください。即ち、以下のようにだけ書いてください。 itemProcessor = Fanctionitem;
dodox86

2020/03/04 08:19

>質問者さん private bool Fanctionitem (IEnumerable<IItem> item)で、 bool型の第2引数が、Fanctionitem()にありませんよ。
tamoto

2020/03/04 08:22

dodox86 さんへ Func<IEnumerable<IItem>,bool> への代入なので、一引数一戻り値の関数で正しいです。
dodox86

2020/03/04 08:34

>tomatoさん 訂正いただきどうもありがとうございます。すみません、ご指摘の通りで、delegateの宣言と完全に見間違えていました。Visual Studio上で確認しました。 >mahryさん 完全に私の指摘間違いです。忘れてください。混乱させてすみません。
mahry

2020/03/04 08:40

>> tamoto さん できました! 何度も根気強く丁寧に教えてくれてとても助かりました! また一歩前に進めそうです。本当にありがとうございました! >>dodox86 さん いえいえ! コード上のつづりの間違い等ご指摘頂きありがとうございました!
guest

0

Public string itemProcessor {get;set;}
であればitemProcessorにはstring型を代入しますよね?

同じように、
Public Func<IEnumerable<IItem>,bool> itemProcessor {get;set;}
であればitemProcessorにはIEnumerable<IItem>ではなくFunc<IEnumerable<IItem>,bool>型を代入することになります。

投稿2020/03/04 07:20

workaholist

総合スコア559

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

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

mahry

2020/03/04 08:03

>> Func<IEnumerable<IItem>,bool>型を代入する というのは、関数を代入するという意味でしょうか? private Func<IEnumerable<IItem>,bool> items(){ } のようなものでしょうか……?そうすると戻り値はどう書くべきなのでしょうか。
guest

0

IEnumerable<IItem> でセットすると思っていたのですが、

IEnumerable<IItem>を受け取って、boolを返す関数(無名関数など)をセットしてあげればいいです。

投稿2020/03/04 07:17

takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問