C# 为什么可以';t我使用ValueType[]扩展方法

C# 为什么可以';t我使用ValueType[]扩展方法,c#,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) { fo

我可以将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;
    }
}
public static void FastReverse(此值类型[]arr)
{
对于(int i=0;i
正如您所观察到的,这是有效的:

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

// usage:
int a = 10;
a.toStringN();
这是因为
int
是一种
ValueType
,所以无论采用何种扩展方法
ValueType
int

但是,如果执行
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!
解决方法是使用泛型并将参数约束为
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;
    }
}
公共静态void FastReverse(此T[]arr),其中T:struct
{
对于(int i=0;i

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

您在这里面临的问题是什么?您的意思是可以使用和不能使用?FastReverse在静态类中是吗?我假设您试图在
int[]
或类似的类中使用它?只有当元素类型转换保持表示时,数组才是协变的。int到ValueType不是这样的转换,因为它需要装箱。解决方案是将FastReverse设置为泛型,而不是使用基类型。首先,为什么要将算法限制为值类型?如果您使用无约束泛型编写代码,那么您的代码可以处理任何类型的数组,而不仅仅是值类型的数组;这里没有一个代码不适用于任意的T.@Sweeper,我理解。引用Eric Lippert的评论,没有约束的方法适用于任何类型。这很多。
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;
    }
}