定义明确的铸造泛型类型在C#(Defining explicit casting for gener

2019-09-23 16:07发布

作为演习的一部分,我试图用一种特定类型的使用时,定义一个通用类的特定行为。 更精确地,我想知道是否有可能定义一个通用类型的显式铸造操作者,即从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[]
    }
}

然而,这并不工作。 如何使编译器的任何想法有苦难言?

Answer 1:

首先, 更改类遵循.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();

个人而言,我会发现,不是一个明确的转换操作符更清晰的反正。



文章来源: Defining explicit casting for generic types in C#