Как расширить операторы stuct KeyValuePair в C #?

Скажем, у меня есть две переменные KeyValuePair.

     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)

Но подскажите, как это сделать с помощью «оператора»?

Я пытался сделать это так:

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);
}

Но появляется сообщение об ошибке: «По крайней мере, один из параметров должен быть Form1».

Это означает, что вы можете создать оператор только для входных данных Form.From1 ... Я подумал о расширении класса KeyValuePair!
Но затем я представил, что «KeyValuePair» - это структура, но не класс!

Можем ли мы создать новую структуру, унаследованную от структуры KeyValuePair?

Итак, как это сделать?
Спасибо!


person IremadzeArchil19910311    schedule 22.04.2016    source источник
comment
Я бы ожидал, что "a" + "b" произведет "ab", а не _3 _... В любом случае, если вы хотите перегрузить оператора, вам придется создать свой собственный тип. Если вы хотите перегрузить оба оператора и использовать KeyValuePair, вы можете определить (явное и / или неявное) операторы преобразования, чтобы упростить преобразование между вашим собственным типом и KeyValuePair.   -  person Pieter Witvoet    schedule 22.04.2016


Ответы (1)


Ты не сможешь это сделать.

Невозможно добавить операторы к другим типам, вы должны добавить их внутри задействованных типов.

Лучшее, что вы можете сделать, - это создать где-нибудь метод расширения или просто обычный метод.

Однако метод расширения также непрост, поскольку у вас нет доступа к операторам для универсальных типов в универсальных методах.

Пример метода расширения, который не работает:

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);
    }
}

Это не скомпилируется с этим:

CS0019 Оператор '+' не может применяться к операндам типа 'TKey' и '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

Вот скрипт .NET для экспериментов.

person Lasse V. Karlsen    schedule 22.04.2016