2012-10-19 11 views
6

クラスではジェネリックを扱っており、課題を完了するように求められました。C#では、なぜ動的型を使用するとジェネリックで演算子を使用できますか?

1つのプロパティprivate T _balance;を持つAccount<T>クラスを作成して、_balanceのクレジットとデビットするメソッドを記述しなければなりませんでした。

Credit method(部分) acc1.Credit(4.6);:私はチェックし調整するために持っていたし、私はこのよう_balance += (T)balanceObject;は、件名に私の読書中にエラーに"Operator '+' cannot be applied to operand of type 'T'"

を与えることができないようにキャスト

public void Credit(T credit) 
    { 
     Object creditObject = credit; 
     Object balanceObject = _balance; 

     Type creditType = creditObject.GetType(); 
     Type balanceType = balanceObject.GetType(); 

     if(creditType.Equals(balanceType)) 
     { 
      if(creditType.Equals(typeof (double))) 
      { 
       balanceObject= (double)balanceObject + (double)creditObject; 
      } 
     ...WITH more else if's on int,float and decimal. 
     } 
     _balance = (T)balanceObject; 
    } 

私はdynamicタイプを発見しました。私の新しいAccountクラスでは、私は新しいメソッドを追加してにCredit方法を変更:これは私が理解していないものである(例えばacc1.Credit(4.6);によりメインから呼び出さ)

public void Credit(dynamic credit) 
    { 
     _balance += ConvertType(credit); 
    } 
    public T ConvertType(object input) 
    { 
     return (T)Convert.ChangeType(input, typeof(T)); 
    } 

。与信方式では、対象がタイプdynamicConvertType(object input)がタイプTとして返されます。 なぜ動的型を使用すると、ジェネリックで演算子を使用できますか?

+0

まだ実行しましたか? 'dynamic'キーワードは、あなたが実際にプログラムを実行するまで、コンパイラが通常行うタイプチェックを遅らせる(遅延させます)。 –

+0

乾杯。プログラムは正常に動作します。私の混乱に加えて、私のジェネリックで数値文字列を投げることを可能にするメソッドConvertTypeが追加されました。 'acc1.Credit(" 100 ");'だから私は 'ジェネリック 'についていくつかの奇妙なアイデアを持ち始めていた。私が '遅延 'を読むとすぐに、ユーレカ! –

答えて

6

dynamicタイプを使用する場合、解像度は実行時まで延期されます。実行時にジェネリック型が+演算子をサポートする場合、コードは機能します。そうでない場合は、例外がスローされます。 dynamicMSDN記事から

:コンパイル時

、動的が 支持任意の操作を想定しているとして入力される要素。

+0

ありがとうございました。今は理にかなっている。 :) –

関連する問題