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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.83049 の関連記事表示

<< 0 >>
■83049  Funcデリゲートについての質問
□投稿者/ rotto -(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つ型パラメーターを指定しています。

    これはどうしてでしょうか?
    理由を教えてください。よろしくお願いします。
親記事 /過去ログ142より / 関連記事表示
削除チェック/

■83050  Re[1]: Funcデリゲートについての質問
□投稿者/ Hongliang -(2017/03/01(Wed) 15:03:13)
記事No.83049 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83051  Re[1]: Funcデリゲートについての質問
□投稿者/ shu -(2017/03/01(Wed) 15:16:08)
    No83049 (rotto さん) に返信


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

    Funcデリゲートは最後のパラメータが戻り値でそれより前は引数に相当します。
    3つのものであれば2つの引数をもつ関数に相当します。
記事No.83049 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83052  Re[1]: Funcデリゲートについての質問
□投稿者/ 魔界の仮面弁士 -(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
記事No.83049 のレス /過去ログ142より / 関連記事表示
削除チェック/

■83074  Re[2]: Funcデリゲートについての質問
□投稿者/ rotto -(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

    なるほどわかりました
    みなさん、丁寧な解説ありがとうございます。
記事No.83049 のレス / END /過去ログ142より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -