中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

voidがgenericで頑張ってくれないんですよ・・・

C#で例えば以下のようなことをしたい

public bool Func<T, U>(T t, U u)
{
  return ( t == null || u == null ) ? true : false;
}

これを呼び出す。

Func<object, object>(null, null);

これはtrue

でも評価する値が1個しかない場合あるよね

Func<object, void>(null, void);

ジェネリックにvoidは突っ込めないので、こんな形はできない。

public TResult Func<TSource, TResult>(TSource source);

こっちは実在するFuncちゃん

でも戻り値いらない場合あるよね。

Func<int, void>(1);

こんな呼び方はできません。かわりにAction使いなさいってことなんだけど、ラムダ式との相性を考えると戻さないことも本当は選びたい。

Func<int, object>(1, null);

意味なくnullをわたしたりするよりもっとこうエレガントに解決したいんだけどね。

投稿日時 : 2008年4月17日 0:42

コメントを追加

# re: voidがgenericで頑張ってくれないんですよ・・・ 2008/04/17 1:08 えムナウ

ラムダ式は関数型で一引数一戻り値が基本です。
FUNCはバリエーションで便利なように四引数まで拡張してくれていますが。

なので値を戻さないラムダ式は本来ナンセンスです。

# re: voidがgenericで頑張ってくれないんですよ・・・ 2008/04/17 1:34 myugaru

戻り値のvoidは使わなければまあvoidになるから何とかなるとして、
引数をvoidにしたい時にはなんともならないですよねえ。
でもポリモーフィズムに引数個数というのも条件になってるわけですから、
使わない、と使う、ってのは関数自体を分けるように設計していくというのが言語思想の流れ上正しいアプローチなのかも知れません。
私はどうもC言語時代から...という可変引数を見ても何だか拒絶反応が出ていた人でしたので、voidが使えないってのがむしろ何だか安心感を得たりしています。

# re: voidがgenericで頑張ってくれないんですよ・・・ 2008/04/17 2:54 NyaRuRu

>Func<int, object>(1, null);
Unit 型を使えば良いのではないでしょうか.

http://blogs.wankuma.com/nagise/archive/2008/03/11/127279.aspx

# This introduces a pleasingly rtaianol point of view. 2012/10/20 17:45 Star

This introduces a pleasingly rtaianol point of view.

タイトル
名前
URL
コメント