【问题标题】:How to extend KeyValuePair stuct operators in C#?如何在 C# 中扩展键值对结构运算符?
【发布时间】:2016-04-22 12:24:49
【问题描述】:

假设我有两个 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”结构的新结构吗?

那么怎么做呢?
谢谢!

【问题讨论】:

  • 我希望"a" + "b" 产生"ab",而不是"a + b"...无论哪种方式,如果您想要运算符重载,您必须创建自己的类型。如果您希望运算符重载并且需要使用KeyValuePair,您可以定义(显式和/或隐式)conversion operators 以简化您自己的类型和KeyValuePair 之间的转换。

标签: c# struct operator-overloading keyvaluepair


【解决方案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”类型的操作数

现在,您可以添加各种 3rd 方 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.

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多