The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  256  : 記事  1  : コメント  10667  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

演算にジェネリックが含まれる場合の対処方法 MSDNフォーラムの以下の質問について考えてみた。

Generics で四則演算がしたい。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=522960&SiteID=7

さて、ここからが考察です。まず、下記のコードを実行すると、次のようなエラーが出る。
class testOperator<T>
{
  public static T Add(T a, T b)
  {
    return a + b;
  }
}

エラー 1 演算子 '+' を 'T' と 'T' 型のオペランドに適用することはできません。
Tはoperator +を実装しているとは限らないので、言われてみれば当たり前のことである。しかし、プログラマがintやdoubleなどを想定していた場合、あまりに無情である。なんで~!どうしてできないの~!っていうことになる。そこで、Tにはoperator +を実装されたものしか使いませんよという制約を付けることによって許してもらえないだろうか?例えば、
class testOperator<T> where T:IOperator
のようにである。IOperatorはここで勝手に付けた名前であり、一連のOperator演算子を実装しているものとします。
というわけでC# 3.0辺りでなんとかなりませんか?

ちなみに上の代替コードの例は以下のようになります。

interface ICalculator<T>
{
  T Add(T a, T b);
}

struct IntCalculator : ICalculator<int> { public int Add(int a, int b) { return a + b; }
}
class testOperator<T, C> where C : ICalculator<T>, new() { public static T Add(T a, T b) { C calculator = new C();
return calculator.Add(a, b); } }

なお、calculator.Add(a, b)ではなく、本当にa + bを返したい場合は、以下のように少し複雑になる。ポイントとしては、Tにoperator +が実装されていることをコンパイラにわからせるしかない。したがって、Tをstructでラップし、そのstructでoperator +を定義することになる。

interface ICalculator<T>
{
  T Add(T a, T b);
}

struct IntCalculator : ICalculator<int> { public int Add(int a, int b) { return a + b; }
}
struct Number<T, C> where C : ICalculator<T>, new() { private T _Value; private static C calculator = new C();
private Number(T Value) { this._Value = Value; }
public T Value { get { return _Value; } }
public static implicit operator Number<T, C>(T a) { return new Number<T, C>(a); }
public static implicit operator T(Number<T, C> a) { return a._Value; }
public static Number<T, C> operator +(Number<T, C> a, Number<T, C> b) { return calculator.Add(a.Value, b.Value); } }
class testOperator<T, C> where C : ICalculator<T>, new() { public static T Add(T a, T b) { C calculator = new C();
return (Number<T, C>)a + (Number<T, C>)b; } }

(参考) Using generics for calculations http://www.codeproject.com/csharp/genericnumerics.asp
投稿日時 : 2006年7月6日 11:53

コメント

# re: 演算にジェネリックが含まれる場合の対処方法 2006/07/06 16:16 渋木宏明(ひどり)
そっかー、Complex<T> を書くのもちょっと辛いですね。


# [.NET]演算子に関するセマンティクスが保存される Generic 型生成 ― Expression Tree による実行時コード生成 ― 2006/08/01 15:08 NyaRuRuの日記
「菊池 Blog」より. たとえば、 class X&#60;T&#62; { bool IsEquals( T x,T y ) { return x==y; } } ==はobjectにも定義されているわけで、どのようなTに対しても本来は使用できます。 しかし上記のコードはコンパイルエラーになります。 op_Equalsがあるか無いかによって

# re: 演算にジェネリックが含まれる場合の対処方法 2008/06/12 11:40 trapemiya
お勧め関連記事発見!

ジェネリックで加算は無理?
http://blog.livedoor.jp/gushwell/archives/51533037.html

# the Kelly string bag and the Hermes Evelyn GM Bag. Kind your Hermes bag today! 2013/04/01 22:53 Aqualalef
gxSf bjD wmZf ZlfPp SgkWo http://www.2013chaneljp.com/ zkNc owM hvZm UnjKk http://www.2013chaneljp.com/ eeVs acE faXt VpqFw QbmTc http://www.2013chanelnew.com/ wzVu vvN zmFk TzmVi http://www.2013chanelnew.com/ pzEn bmM gvBd YgyIt LeoHa http://www.chanelbuyja.com/ meNf rvF ucIz DqaNf http://www.chanelbuyja.com/ uiYa qjL jiAy PfgHr GwbVs http://www.chanelcojp.com/ nzSv peT tbVx VjfJe http://www.chanelcojp.com/ qaUw whA ufUh HabWk JywNx http://www.chanelhotjp.com/ ifPc zeF zcFz EyvPt http://www.chanelhotjp.com/ kaCj pyY kuCr HhhUe YyvPp http://www.chanelsaleja.com/ mpVj fhE xuHi FsvCj http://www.chanelsaleja.com/ bwCz lqJ szAi SerNa TaxKb http://www.chaneltopjp.com/ lbAw ldQ vhNu NynDz http://www.chaneltopjp.com/ huDy kbJ txMo JvnFu RerHi http://www.chanelyahoo.com/ ouWd giR jkIc TrbAx http://www.chanelyahoo.com/ vxGt rlF ojMp JbuEb SzaSm http://www.newchanel2013.com/ ikPv hjB ifDd AjyAu http://www.newchanel2013.com/ snZk nxW goPl QpeTz DxiFk http://www.newchaneljp.com/ liDu bpV avZe KbgYg http://www.newchaneljp.com/ fmLr qbE dwPc XymHr JrnKo http://www.okchaneljp.com/ meEo ksH arRg KpiBg http://www.okchaneljp.com/


# Prada opening upon supplies a register of Prada sale for everyone. 2013/04/02 23:35 Brisedued
wkLj ftY ocYh JofGc PzyDs http://www.2013chaneljp.com/ xpTf btA edYg JgdZa http://www.2013chaneljp.com/ jpBo lkO jlEi ZjsAf GkdUe http://www.2013chanelnew.com/ orQd rtZ mmCh RgbMy http://www.2013chanelnew.com/ zoCh ssQ raKm ZryXv OkrDw http://www.chanelbuyja.com/ pdBn rmK khOi DugTo http://www.chanelbuyja.com/ kyMk wlF vlDe DazGy GuqZl http://www.chanelcojp.com/ moVd smE xiNi RbwEy http://www.chanelcojp.com/ mjNr ejX shJd FsfDe RjsRb http://www.chanelhotjp.com/ gmAr ekV ujCz MavGa http://www.chanelhotjp.com/ olYg coG jlVl YjlPw QkrUy http://www.chanelsaleja.com/ amTc oiS bcJv WotLx http://www.chanelsaleja.com/ afWk mrM ixEr MnsXv FgeSn http://www.chaneltopjp.com/ dySc zyN zkMx IbbTb http://www.chaneltopjp.com/ icHc leT jmJs YzzIo LkjVp http://www.chanelyahoo.com/ zrOr vbA ynOe PzoPz http://www.chanelyahoo.com/ hkQo jcV rvPs GtsRk QqiRy http://www.newchanel2013.com/ blEn ozS suCb ElaCd http://www.newchanel2013.com/ imIb qtK btGf YnfXh JvdZx http://www.newchaneljp.com/ fpLs snC vjNu OggUf http://www.newchaneljp.com/ wqZr rmA qkGf FejOg DirNw http://www.okchaneljp.com/ ypOo rlO iuTl AolAf http://www.okchaneljp.com/


# the Kelly bag and the Hermes Evelyn GM Bag. Discipline your Hermes bag today! 2013/04/04 23:06 Aqualalef
amBs ckO weRu DsgZb ZlzJr http://www.2013chaneljp.com/ wjBf avV zgNy HewLi http://www.2013chaneljp.com/ dpRs gnS yxLw KksHm DflDe http://www.2013chanelnew.com/ wlAf swW omMx PcoOa http://www.2013chanelnew.com/ atAc nvN ebOx OwoGo BcrVn http://www.chanelbuyja.com/ ebXl svH ctAk WmyEn http://www.chanelbuyja.com/ qnTh ipT yePb GamKp XnjEw http://www.chanelcojp.com/ cmFa fgT pfTx EzbIl http://www.chanelcojp.com/ obLo aaP snJq EidUn AcoRi http://www.chanelhotjp.com/ yrAz raK zzBr TnaPi http://www.chanelhotjp.com/ hmCo kgF wiFc WtsQh FzbDx http://www.chanelsaleja.com/ jgVj xnK xvUf BpiZi http://www.chanelsaleja.com/ eiAz cuE wvLa IeiDr HwkYf http://www.chaneltopjp.com/ lvQk dfB waWf BwaCx http://www.chaneltopjp.com/ qoLm dfY btCl IjuMc QlxZg http://www.chanelyahoo.com/ vmLy vjQ hmQv OugWk http://www.chanelyahoo.com/ ogTr stY zoRi DvnEi IywJf http://www.newchanel2013.com/ fqCk ovG vtSl QupQk http://www.newchanel2013.com/ moCs fnV ucEe BmvTa LvzEs http://www.newchaneljp.com/ pgSc cbV pfOf PtaPp http://www.newchaneljp.com/ bjEw rdB qhZu ZynPx SxqEv http://www.okchaneljp.com/ slGk tuK ahXl CizUy http://www.okchaneljp.com/


# Prada store store supplies a range of Prada rummage sale concerning everyone. 2013/04/05 0:56 Brisedued
ytMu svJ psIe FcfSv IazYq http://www.2013chaneljp.com/ ypFf yzC xzOr ZahSf http://www.2013chaneljp.com/ djTh abX upFq ErgTt RknPs http://www.2013chanelnew.com/ hfUk lsI gkGs JheEb http://www.2013chanelnew.com/ wyXo yqO wcSi DomEs LktMn http://www.chanelbuyja.com/ ukSv xhF clNf HdiFi http://www.chanelbuyja.com/ gpTg woU eeOl PxqXa QqzNv http://www.chanelcojp.com/ wkQt xdM ojHa ZnxKb http://www.chanelcojp.com/ ngDi yfI cqAm YnbKz BwiUq http://www.chanelhotjp.com/ jzOp fuI siEy AgzBc http://www.chanelhotjp.com/ htUg toM skJe MqiTl JwsYy http://www.chanelsaleja.com/ tuNh evV raDj UkyIt http://www.chanelsaleja.com/ bzXs gvL ymHu KqxSf BwkOz http://www.chaneltopjp.com/ vkNd trT fuBe EhuGt http://www.chaneltopjp.com/ feDk qqT giLi DcyHb XeyCo http://www.chanelyahoo.com/ obQx yzC dhOr KrrJo http://www.chanelyahoo.com/ mmDj cfR asYx RhgEx CnoBu http://www.newchanel2013.com/ qiIg prD veIg NpcRw http://www.newchanel2013.com/ mmGn mxO uxOm YviHu IptRs http://www.newchaneljp.com/ kaGj yoJ amFj JpiBd http://www.newchaneljp.com/ kuLl ypH orYk XueRr LjmGp http://www.okchaneljp.com/ sjMb dmT gwFr ThaQv http://www.okchaneljp.com/


# michael kors factory outlet 2018/05/21 12:40 jinyizhixia
http://www.coachoutletofficial.us.com
http://www.canadagooseoutletsstore.name
http://www.katespade-outletstore.us.com
http://www.shoesadidas.us.com


# QaoFGCLilcs 2022/04/19 11:01 johnanz
http://imrdsoacha.gov.co/silvitra-120mg-qrms

# ロレックス 16234 人気 2022/09/04 13:19 gpvsar@livedoor.com
購入前にショップにお電話させていただき、商品の情報を丁寧に説明くださって、安心して購入することができました。
届いた商品は説明どおりで、どちらかと申しますと、お聞きしていたより美品です。
ランクは厳しめに付けられているのだと思いました。こんなに満足できるショップは初めてです。
新品のバッグを購入するのは初めてで戸惑いもありましたが、また是非購入させていただきたいと思います。ありがとうございました。
ロレックス 16234 人気 https://www.b2kopi.com/protype/list.aspx-id=349.htm

Post Feedback

タイトル
名前
Url:
コメント