C#, C♯, C#相談室 Part44

このエントリーをはてなブックマークに追加
295デフォルトの名無しさん
なんで四則演算可能なプリミティブ型のためにICalculableみたいなインターフェイスを用意しなかったんだろう
ジェネリッククラスが書き難い
296デフォルトの名無しさん:2007/11/26(月) 16:34:48
>>295
俺もそれは思ったことあるけど、その方法って微妙なところもあるのよね。

class Rational : ICalculable // 有理数

class Galois2 : ICalculable // 位数2のガロア体
があったときに、
Rational p;
Galois2 q;
var r = p + q;
はどう扱えばいいのかとか。
297デフォルトの名無しさん:2007/11/26(月) 16:37:21
左オペランドの側に合わせて、
p.Add(q) と解釈することにして、
Add の中で型チェックすればよさそうに思えるけど、
それだと今度、
class Real : ICalculable // 多倍長・任意精度の実数
みたいなのに対して、
double x;
Real y;
var z = x + y; // double と Real 間の演算は認めたい
をどうするかで困る。

implicit なキャストと上記のルールで何とかならないでもないけど。
298デフォルトの名無しさん:2007/11/26(月) 16:58:47
異なる型の間では演算がそもそも定義されない場合もあるし
同じ型同士でも乗算は定義されるけど除算は定義されないとかあるし
299デフォルトの名無しさん:2007/11/26(月) 17:37:57
定義できる場合だけでも使えるようにすればいいと思うけどなぁ
定義できない場合は例外投げるようにするとか
あと制約条件はなんでシールクラスはだめなんだろう
300デフォルトの名無しさん:2007/11/26(月) 17:57:47
>あと制約条件はなんでシールクラスはだめなんだろう
できたところで何の意味がある?w
301デフォルトの名無しさん:2007/11/26(月) 18:10:05
>>300
制約条件にintやdoubleなんかを指定できるようになる
302デフォルトの名無しさん:2007/11/26(月) 18:24:20
structでいいじゃん
303デフォルトの名無しさん:2007/11/26(月) 18:28:29
intって書けばいいんじゃないか
304デフォルトの名無しさん:2007/11/26(月) 19:11:43
305デフォルトの名無しさん:2007/11/26(月) 20:27:06
Tの制約条件にintって書くならそのままintって書けばいいんじゃないのかと
306デフォルトの名無しさん:2007/11/26(月) 20:32:48
特殊化が出来てほしいと思うこともある。
プライマリ制約別に特殊化って感じで。
307デフォルトの名無しさん:2007/11/26(月) 20:34:01
コードで書いてみてくれんか
308デフォルトの名無しさん:2007/11/26(月) 20:34:49
>>307>>305
309デフォルトの名無しさん:2007/11/26(月) 20:36:52
特殊化から出来ないからな
まあ別に困らないけど
310デフォルトの名無しさん:2007/11/26(月) 20:37:42
void Method<T>(T num) where T : int って書くなら
void Method(int num) でいいんじゃないのかと
311デフォルトの名無しさん:2007/11/26(月) 20:53:26
ああなるほど
312デフォルトの名無しさん:2007/11/26(月) 21:09:48
値型なら実行時に特殊化されるけど