トップページ > プログラム > 2015年10月06日 > 14/sy/Q9

書き込み順位&時間帯一覧

9 位/142 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000100002010000000004



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
108
C#, C♯, C#相談室 Part89 [転載禁止]©2ch.net

書き込みレス一覧

C#, C♯, C#相談室 Part89 [転載禁止]©2ch.net
106 :デフォルトの名無しさん[sage]:2015/10/06(火) 07:04:31.85 ID:14/sy/Q9
LINQが使っているIEnumerableに定義されている拡張メソッドの理解がどうもすっきりとせずに辛い。混乱してくる。

IEnumerable<TSource>という型があったとすると、次のように拡張メソッドが定義される。(extendmethodメソッドなんてLINQにはないけど、例として)


public static IEnumerable<TResult> extendmethod<TSorce, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>>)
{
中身は知らない;(質問0:LINQを使うだけなら知る必要はないですか?)
}

これによって、IEnumerable<anyType>インターフェイスを継承したオブジェクトなら、extendmethodメソッドが使えるようになるわけだと思う。(質問1:合ってますでしょうか)

で、extendmethodメソッドは、引数として、Func<TSource, IEnumerable<TResult>>ビルトインデリゲートのみを採っている。(this修飾のは、拡張メソッドの定義用で引数でない)
このデリゲートの定義で、TSourceはデリゲートの引数型、IEnumerable<TResult>は戻り型になっている。
しかし、メソッド名extendmethodのすぐあとにある<TSorce, TResult> って何なのでしょうか。どこで使われるんでしょうか。引数型だけではなぜ定義不足なのかわかりません。これが一番わからないです。(質問2)


よろしくお願いします。
C#, C♯, C#相談室 Part89 [転載禁止]©2ch.net
108 :デフォルトの名無しさん[sage]:2015/10/06(火) 12:38:22.34 ID:14/sy/Q9
>>107
親切にお答えくださってありがとうございます。
ぼんやりと見えてきた感じがします。(まだその程度)


>型引数はもちろん手動で hoge.extensionmethod<Hoge, int>( と指定することもできる。

これは、面白いです。
extendmethod<TSorce, TResult>の、わざわざ角かっこ内に定義されたジェネリック型指定が活きてきたからです。
つまり、extendmethod<TSorce, TResult>のように、ジェネリック型を定義することではじめてコード内でその型のプレースホルダを使えるようになることがわかりました。

次のように言えるわけでしょうか。


hoge が、IEnumerable<Hoge>型のオブジェクトであるとき、そして、x.yであらわされる値がint型であるとき、
次のようにして拡張メソッドを呼び出すことができる。
また、使用する拡張メソッドの定義は、次のとおり)
public static IEnumerable<TResult> extensionmethod<TSorce, TResult>(this IEnumerable<TSource> source, Func<TSource, int> f) {}

この拡張メソッド呼び出し方:

1、ノーマルな呼び出し方(このとき、2点は暗黙に指定されている。以下2、3の呼び出し方でこれらをそれぞれ明示的にしていく)
hoge.extendmethod(x => x.y)

2、メソッド内で使われるジェネリック型を、明示的に、指定する
hoge.extendmethod<Hoge, int>(x => x.y)
このとき、ラムダ式のxは、TSourceなので、すなわち、Hoge型ということになる。(質問:合っていますでしょうか)

3、拡張メソッドであることも、明示的に、表しながら呼び出す
hoge.extendmethod<Hoge, int>(this hoge, x => x.y)

C#, C♯, C#相談室 Part89 [転載禁止]©2ch.net
109 :108[sage]:2015/10/06(火) 12:39:00.18 ID:14/sy/Q9
メソッド名に続くこういうジェネリック型指定、たとえばMethod<T1,T2>のような書き方は普段はつかっていませんでした。
Methodは引数の型だけを意識していました。
普通のクラス内にメソッドを定義するときにも、こういう形式は使えるんだと思いました。(質問 B:以下のコードは正しいでしょうか。)

public string Method<T1>(T1 z)
{
return T1.ToString();
}

ありがとうございます。
C#, C♯, C#相談室 Part89 [転載禁止]©2ch.net
111 :108[sage]:2015/10/06(火) 14:34:29.84 ID:14/sy/Q9
>>110
すみません、ありがとうございます。

>Foo.extendedMethod( hoge, x=>x.y );

this修飾子は、呼び出す側には不要ってことなんですね。


>return z.ToString();

そうか、引数定義で指定したメソッド内変数zが、ジェネリックT1で型打ちされているから、
これでいいわけか。
なるほど。ありがとうございます。

あとは、コンパイラに指摘されながら、覚えていきたいと思います。


ご親切にお相手くださってありがとうございました。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。