2016-04-22 10 views
0

私は2つのKeyValuePair変数を持っているとしましょう。C#でKeyValuePair stuct演算子を拡張するには?

 KeyValuePair<string, double> kv1 = new KeyValuePair<string, double>("a", 5); 
    KeyValuePair<string, double> kv2 = new KeyValuePair<string, double>("b", 7); 

"KeyValuePair"構造体に+演算の定義はありません。
だから私は演算子のオーバーロードを使用したい!

私の目標は、のような第三KeyValuePair型変数を取得することです:

KeyValuePair<string, double> kv1 = new KeyValuePair<string, double>(kv1.Key + " + " + kv2.Key, kv1.Value + kv2.Value); 

を、結果は次のようになります。

KeyValuePair<string, double>("a + b", 12) 

しかし、どのように「演算子」を使用してそれを行うには教えてください?

私はこの方法のようにそれをやろうとした

:あなたができることを意味 「パラメータの少なくとも一方がForm1のあるべき」

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
    KeyValuePair<string, double> kv1 = new KeyValuePair<string, double>("a", 5); 
    KeyValuePair<string, double> kv2 = new KeyValuePair<string, double>("b", 7); 

    KeyValuePair<string, double> k = kv1 + kv2; 
    } 
    public static KeyValuePair<string, double> operator +(KeyValuePair<string, double> c1, KeyValuePair<string, double> c2) => new KeyValuePair<string, double>(c1.Key + " + " + c2.Key, c1.Value + c2.Value); 
} 

しかし、というエラーメッセージがありますForm.From1の入力のための演算子を作成するだけ... 私はKeyValuePairクラスを拡張すると思った!
しかし、 "KeyValuePair"は構造体ですが、クラスではありません。

"KeyValuePair"構造体から継承する新しい構造体を作成できますか?

どうすればいいですか?
ありがとうございます!

+0

私は '' a "+" b "'が '' a + b ''ではなく' 'ab'' 'を生成すると期待しています...どちらにせよ、演算子のオーバーロードを望むなら、自分のタイプ。演算子のオーバーロードを必要とし、 'KeyValuePair'を使用する必要がある場合、(明示的および/または暗黙的な)[変換演算子](https://msdn.microsoft.com/en-us/library/85w54y0a.aspx)を独自の型と 'KeyValuePair'間の変換を容易にします。 –

答えて

5

これはできません。他のタイプの演算子を追加する方法はありません

、あなたはそれらに関与内部のタイプを追加する必要があります。

あなたができることは、拡張メソッドを作成するか、通常の方法をどこかに作成することです。

ただし、ジェネリックメソッドのジェネリック型の演算子にアクセスできないため、拡張メソッドも簡単ではありません。

拡張メソッドの例それは動作しません:

CS0019演算子「+」型「TKEY」とのオペランドに適用することはできません:これはこれでコンパイルに失敗します

public static class MyKeyValuePairExtensions 
{ 
    public static KeyValuePair<TKey, TValue> Add<TKey, TValue>(
     this KeyValuePair<TKey, TValue> first, 
     KeyValuePair<TKey, TValue> second) 
    { 
     return new KeyValuePair<TKey, TValue>(
      first.Key + second.Key, 
      first.Value + second.Value); 
    } 
} 

「TKEY」今

、あなたあなたがこれをシミュレートすることができますさまざまなサードパーティ製のnugetパッケージに追加することもできますが、私はこれを読者のためのエクササイズとして残すつもりです。

異なる選択肢はちょうどあなたの特定のケースのための拡張メソッドを追加することです:

public static class MyKeyValuePairExtensions 
{ 
    public static KeyValuePair<string, double> Add(
     this KeyValuePair<string, double> first, 
     KeyValuePair<string, double> second) 
    { 
     return new KeyValuePair<string, double>(
      first.Key + " + " + second.Key, 
      first.Value + second.Value); 
    } 
} 

あなたは、このようにそれを呼び出します。

KeyValuePair<string, double> kv1 = new KeyValuePair<string, double>("a", 5); 
KeyValuePair<string, double> kv2 = new KeyValuePair<string, double>("b", 7); 
var sum = kv1.Add(kv2); Key="a + b", and Value=12 

Here's a .NET Fiddle to experiment with