将 C# 类型参数限制为一系列原始类型?

Constraining a C# type parameter to a series of primitive types?

我有一个 class 描述了一个可以序列化为自定义二进制格式并返回的数组。该数组有一个指定其值的类型参数,可以是 intdoublebool。我想写这样的东西:

class BArray<T> where T: int, double, bool {
    BArray(T[] values) { ... }
    byte[] Encode() { ... }
    T[] Decode(byte[] bytes) { ... }
    ...
}

我知道这不能编译,但有办法吗?如果不是,那么做接近此的事情的最佳方法是什么?本质上,我需要 EncodeDecode 方法的不同行为,具体取决于数组值的类型。此外,我希望 class 用户不必担心不同的实现,即以下应该有效:

var ints = new int[] { 1, 2, 3 };
var intB = new BArray(ints);

var dbls = new double[] { 3, 4 };
var dblB = new BArray(dbls);

但是使用未实现的类型应该会失败:

var strs = new string[] { "this", "should", "fail" };
var strB = new BArray(strs); // TYPE ERROR!

谢谢!

这是你要做的最好的事情:

abstract class BArray<T>
{
    byte[] Encode();
    T[] Decode(byte[] bytes);
}

class BArrayInt : BArray<int> { ... }
class BArrayDouble : BArray<double> { ... }
...

static class BArray
{
    public static BArray<int> Create(int[] values)
    {
        return new BArrayInt(values);
    }
    public static BArray<double> Create(double[] values)
    {
        return new BArrayDouble(values);
    }
    ...
}

每个 BArray* classes 都提供了 EncodeDecode 的实现。 BArray<T> class 的用户只需编写 BArray.Create(values),它将适用于您定义的 int[]double[] 等类型的 values