在C#中为泛型类型定义显式转换

时间:2012-10-07 08:16:18

标签: c# generics casting explicit

作为练习的一部分,我试图在与特定类型一起使用时为泛型类定义特定行为。更确切地说,我想知道是否可以为泛型类型定义显式的转换运算符,即从list<T>int[]

不,我知道我可以简单地定义一个完成工作的方法,但这不是练习的目标。

假设泛型类list<T>我试图定义以下显式转换方法

class list<T> {
...

    public static explicit operator int[](list<T> _t) where T : System.Int32 
    {
        // code handling conversion from list<int> to int[]
    }
}

然而,这不起作用。关于如何让编译器吞下这个的任何想法?

1 个答案:

答案 0 :(得分:4)

首先,更改类的名称以遵循.NET约定避免与List<T>发生冲突。

除此之外,你基本上不能做你想做的事情。您可以定义对所有 T有效的转化,然后针对不同的情况采取不同的操作。所以你可以写:

public static explicit operator T[](CustomList<T> input)

,如果Tint,则对此区别对待。做最后一部分并不好,但如果你真的想要,你就可以做到。

特定泛型类型的可用成员是相同的类型参数(在类型参数声明点声明的约束内) - 否则它不是真正的通用。

作为替代方案,您可以在其他地方的顶级静态非泛型类型中定义扩展方法:

public static int[] ToInt32Array(this CustomList<int> input)
{
    ...
}

这将允许你写:

CustomList<int> list = new CustomList<int>();
int[] array = list.ToInt32Array();

就个人而言,无论如何,我发现它比显式转换运算符更清晰。