08/07/22 22:56:35
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
前スレ
ふらっとC#,C♯,C#(初心者用) Part28
スレリンク(tech板)
2:デフォルトの名無しさん
08/07/22 22:58:25
[プログラム板] C#, C♯, C#相談室 Part47
スレリンク(tech板)
WPF(XAML,XBAP,.NET3.5)GUIプログラミング
スレリンク(tech板)
Live2
スレリンク(tech板)
初心者のためのプログラミング言語ガイド Part9
スレリンク(tech板)
3:デフォルトの名無しさん
08/07/22 22:59:15
参考サイト。まずはここで検索してから。
URLリンク(www.google.co.jp)
URLリンク(homepage3.nifty.com)
URLリンク(www.atmarkit.co.jp)
URLリンク(dobon.net)
URLリンク(jeanne.wankuma.com)
URLリンク(www.labasp.net)
4:デフォルトの名無しさん
08/07/22 23:09:47
>>1
乙
5:デフォルトの名無しさん
08/07/23 01:33:02
>>1
乙
6:デフォルトの名無しさん
08/07/23 02:20:41
ジェネリックのwhere節で型パラメタをintやshortやlongなどの整数型に限って
それらの型同士の四則演算をするにはどうすればいいですか?
7:デフォルトの名無しさん
08/07/23 02:34:39
無理
Expressionクラス使って無理矢理やれないこともないけど
8:デフォルトの名無しさん
08/07/23 02:52:11
static T Add<T>(T a, T b) where T : struct {
var paramA = Expression.Parameter(typeof(T), "a");
var paramB = Expression.Parameter(typeof(T), "b");
var body = Expression.Add(paramA, paramB);
var lamdba = Expression.Lambda<Func<T, T, T>>(body, paramA, paramB).Compile();
return lamdba(a, b);
}
こんなかんじ
このまま使ったら毎回メソッド生成してとんでもなく遅いはずだからlamdbaはキャッシュしてね
9:デフォルトの名無しさん
08/07/23 04:47:19
型パラメータの指定の方は、staticコンストラクタで
switch(typeof(T)) {
case typeof(int):
case typeof(short):
case typeof(long):
break;
default:
throw new Exception();
// どうせ TypeInitializationException にされるが、
// TypeParameterException とか作ってもいい
}
とかすると、where句で表現できない制限でも
インスタンスを生成/staticメンバを参照しようとした時点でエラーにできる
四則演算の方は、同じくstaticコンストラクタで>>8のデリゲートまでを生成して、
static T Add<T>(T a, T b) {
return AddFunc(T, T); // AddFunc is Func<T, T, T>
}
とか
10:9
08/07/23 04:48:36
あと、俺は前に全ての演算をラップするクラスを作ったりしたな
定義されていない演算は使おうとすると例外投げたり、
元の型と相互に暗黙の型変換できるようにしたりして
// a, b is T
Operand<T> _a = a;
Operand<T> _b = b;
T c = _a + _b;
T d = _a << 8;
というふうにジェネリックで使えるようなやつ
11:デフォルトの名無しさん
08/07/23 10:52:59
なるほど
ありがとうございます