为什么我不能使用ValueType []扩展方法

时间:2018-11-30 06:37:39

标签: c#

我可以将ValueType扩展方法与

一起使用
public static string ToStringN(this ValueType value)
{
    return Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture);
}

但是我不能使用ValueType数组的扩展方法。

public static void FastReverse(this ValueType[] arr)
{
    for (int i = 0; i < arr.Length / 2; i++)
    {
        ValueType tmp = arr[i];
        arr[i] = arr[arr.Length - i - 1];
        arr[arr.Length - i - 1] = tmp;
    }
}

1 个答案:

答案 0 :(得分:2)

如您所见,它可以起作用:

public static string ToStringN(this ValueType value)
{
    return Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture);
}

// usage:
int a = 10;
a.toStringN();

这是因为intValueType,所以ValueTypeint的任何扩展方法也都有它。

但是,如果您使用ValueType[]的扩展方法,

public static void FastReverse(this ValueType[] arr)
{
    for (int i = 0; i < arr.Length / 2; i++)
    {
        ValueType tmp = arr[i];
        arr[i] = arr[arr.Length - i - 1];
        arr[arr.Length - i - 1] = tmp;
    }
}

// usage:
int[] a = {1,2,3};
a.FastReverse(); // Can't find this method!

这是因为int[]ValueType[]彼此不是子类型。例如,它不会编译:

ValueType[] a = new int[10];

一种解决方法是使用泛型并将参数约束为struct

public static void FastReverse<T>(this T[] arr) where T: struct
{
    for (int i = 0; i < arr.Length / 2; i++)
    {
        T tmp = arr[i];
        arr[i] = arr[arr.Length - i - 1];
        arr[arr.Length - i - 1] = tmp;
    }
}

这可能不完全是您想要的行为,因为它不适用于int?[]