C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Funcデリゲートについての質問

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■83049 / inTopicNo.1)  Funcデリゲートについての質問
  
□投稿者/ rotto (1回)-(2017/03/01(Wed) 14:45:31)

分類:[.NET 全般] 

デリゲートについて質問させてください
例えば、Funcデリゲートですが
c#では

public delegate TResult Func<in T, out TResult>(
T arg
)
という風に定義されています。
ジェネリックで
第1パラメーターがT型、第2パラメーターがTresult型になっています。

つまり、第1パラメーターで受け取った型が処理の引数に
第2パラメーターで受け取った型が処理の戻り値になります。

これは、これでいいのですが Ienumerableインターフェースに追加されている
拡張メソッドににはこのような記述があります。

public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource,&#8194;int,&#8194;bool> predicate
)

Func<Tsource,int,bool>とあります。

Funcデリゲートの型パラメーターは2つまで受け取り可能だと思っていたのですが
ここでは3つ型パラメーターを指定しています。

これはどうしてでしょうか?
理由を教えてください。よろしくお願いします。

引用返信 編集キー/
■83050 / inTopicNo.2)  Re[1]: Funcデリゲートについての質問
□投稿者/ Hongliang (505回)-(2017/03/01(Wed) 15:03:13)
FuncとActionは、大量の引数違いのものが定義されています。
https://msdn.microsoft.com/ja-jp/library/system.aspx
引用返信 編集キー/
■83051 / inTopicNo.3)  Re[1]: Funcデリゲートについての質問
□投稿者/ shu (968回)-(2017/03/01(Wed) 15:16:08)
No83049 (rotto さん) に返信


> Funcデリゲートの型パラメーターは2つまで受け取り可能だと思っていたのですが
> ここでは3つ型パラメーターを指定しています。

Funcデリゲートは最後のパラメータが戻り値でそれより前は引数に相当します。
3つのものであれば2つの引数をもつ関数に相当します。
引用返信 編集キー/
■83052 / inTopicNo.4)  Re[1]: Funcデリゲートについての質問
□投稿者/ 魔界の仮面弁士 (1153回)-(2017/03/01(Wed) 17:59:18)
2017/03/01(Wed) 18:04:50 編集(投稿者)

No83049 (rotto さん) に返信
> これは、これでいいのですが Ienumerableインターフェースに追加されている
× Ienumerable
○ IEnumerable


> Funcデリゲートの型パラメーターは2つまで受け取り可能だと思っていたのですが
> ここでは3つ型パラメーターを指定しています。

shu さんが指摘されているように、Func は最後の型パラメーターが戻り値で、
それより前は引数の型です。

また、引数部の型パラメーターの数は、.NET 3.5.x では0〜4個、
.NET 4 以降では0〜16個の実装があります。
この点は Hongliang さんが指摘されていますね。


補足としてもう一つ。共変性/反変性についても触れさせてください。

 // 引数 0 個、戻り値 string 型なデリゲート
 Func<string> func1 = delegate { return "TEST"; };

 // それを戻り値 object なデリゲートに代入
 Func<object> func2 = func1;

上記は .NET Framework 3.5.x ではエラーになりますが、
.NET Framework 4 以降では問題ありません。


CLR2 では『delegate TResult Func<T1, T2, TResult>』表記でした。
https://msdn.microsoft.com/ja-jp/library/bb534647%28vs.90%29.aspx

CLR4 からは『delegate TResult Func<in T1, in T2, out TResult>』表記です。
https://msdn.microsoft.com/ja-jp/library/bb534647%28vs.100%29.aspx


型パラメータの in 指定は、『反変』であることを意味します。
型パラメータの out 指定は、『共変』であることを意味します。

in は「引数」あるいは setter 専用であることを示し、
out は「戻り値の型」あるいは getter 専用であることを示しますが、
これについては下記が参考になると思います。
http://ufcpp.net/study/csharp/sp4_variance.html
引用返信 編集キー/
■83074 / inTopicNo.5)  Re[2]: Funcデリゲートについての質問
□投稿者/ rotto (2回)-(2017/03/03(Fri) 17:25:14)
No83052 (魔界の仮面弁士 さん) に返信
> 2017/03/01(Wed) 18:04:50 編集(投稿者)
>
> ■No83049 (rotto さん) に返信
>>これは、これでいいのですが Ienumerableインターフェースに追加されている
> × Ienumerable
> ○ IEnumerable
>
>
>>Funcデリゲートの型パラメーターは2つまで受け取り可能だと思っていたのですが
>>ここでは3つ型パラメーターを指定しています。
>
> shu さんが指摘されているように、Func は最後の型パラメーターが戻り値で、
> それより前は引数の型です。
>
> また、引数部の型パラメーターの数は、.NET 3.5.x では0〜4個、
> .NET 4 以降では0〜16個の実装があります。
> この点は Hongliang さんが指摘されていますね。
>
>
> 補足としてもう一つ。共変性/反変性についても触れさせてください。
>
>  // 引数 0 個、戻り値 string 型なデリゲート
>  Func<string> func1 = delegate { return "TEST"; };
>
>  // それを戻り値 object なデリゲートに代入
>  Func<object> func2 = func1;
>
> 上記は .NET Framework 3.5.x ではエラーになりますが、
> .NET Framework 4 以降では問題ありません。
>
>
> CLR2 では『delegate TResult Func<T1, T2, TResult>』表記でした。
> https://msdn.microsoft.com/ja-jp/library/bb534647%28vs.90%29.aspx
>
> CLR4 からは『delegate TResult Func<in T1, in T2, out TResult>』表記です。
> https://msdn.microsoft.com/ja-jp/library/bb534647%28vs.100%29.aspx
>
>
> 型パラメータの in 指定は、『反変』であることを意味します。
> 型パラメータの out 指定は、『共変』であることを意味します。
>
> in は「引数」あるいは setter 専用であることを示し、
> out は「戻り値の型」あるいは getter 専用であることを示しますが、
> これについては下記が参考になると思います。
> http://ufcpp.net/study/csharp/sp4_variance.html

なるほどわかりました
みなさん、丁寧な解説ありがとうございます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ