如何在c#中交换通用结构?

时间:2012-01-30 19:57:39

标签: c# struct

我的结构如下。现在,我想要交换2结构。

public struct Pair<T, U>
{
    public readonly T Fst;
    public readonly U Snd;

    public Pair(T fst, U snd)
    {
        Fst = fst;
        Snd = snd;
    }

    public override string ToString()
    {
        return "(" + Fst + ", " + Snd + ")";
    }

    **public Pair<U, T> Swap(out Pair<U, T> p1, Pair<T,U> p2)
    {
        p1 = new Pair<U, T>(p2.Snd, p2.Fst);

        return p1; 
    }**
}

在Main方法中试试这个:

        Pair<int, String> t1 = new Pair<int, string>();
        Pair<String, int> t2 = new Pair<string,int>("Anders",13);
        **t1.Swap(out t1,);** //compilator tells -> http://i.stack.imgur.com/dM6P0.png

Swap方法上的参数与compilator achive不同。

2 个答案:

答案 0 :(得分:5)

这里不需要输出参数。只需将其定义为:

public Pair<U, T> Swap()
{
    return new Pair<U, T>(this.Snd, this.Fst);
}

然后你可以这样做:

Pair<string, int> t2 = new Pair<string,int>("Anders",13);
Pair<int, string> t1 = t2.Swap();

答案 1 :(得分:0)

您的Swap方法有点令人困惑。通过引用传递参数(out)然后返回相同的参数没有多大意义。顺便说一句,编译器期望的参数完全正确。你有Pair<int,String>(t1),所以T == int和U == String你有第二个参数定义为Pair<T,U>所以T必须是int而U必须是{{ 1}}。

String的不那么令人困惑的实现看起来像这样:

Swap

或者像这样:

public static void Swap(out Pair<U, T> p1, Pair<T,U> p2)
{
    p1 = new Pair<U, T>(p2.Snd, p2.Fst);
}

我更喜欢这个:

public void Swap(out Pair<U,T> pSwapped)
{
     pSwapped = new Pair<U,T>(Snd,Fst);
}

然而,因为实际上没有必要通过引用传递任何东西。