将 C# 类型参数限制为一系列原始类型?
Constraining a C# type parameter to a series of primitive types?
我有一个 class 描述了一个可以序列化为自定义二进制格式并返回的数组。该数组有一个指定其值的类型参数,可以是 int
、double
或 bool
。我想写这样的东西:
class BArray<T> where T: int, double, bool {
BArray(T[] values) { ... }
byte[] Encode() { ... }
T[] Decode(byte[] bytes) { ... }
...
}
我知道这不能编译,但有办法吗?如果不是,那么做接近此的事情的最佳方法是什么?本质上,我需要 Encode
和 Decode
方法的不同行为,具体取决于数组值的类型。此外,我希望 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 都提供了 Encode
和 Decode
的实现。 BArray<T>
class 的用户只需编写 BArray.Create(values)
,它将适用于您定义的 int[]
、double[]
等类型的 values
。
我有一个 class 描述了一个可以序列化为自定义二进制格式并返回的数组。该数组有一个指定其值的类型参数,可以是 int
、double
或 bool
。我想写这样的东西:
class BArray<T> where T: int, double, bool {
BArray(T[] values) { ... }
byte[] Encode() { ... }
T[] Decode(byte[] bytes) { ... }
...
}
我知道这不能编译,但有办法吗?如果不是,那么做接近此的事情的最佳方法是什么?本质上,我需要 Encode
和 Decode
方法的不同行为,具体取决于数组值的类型。此外,我希望 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 都提供了 Encode
和 Decode
的实现。 BArray<T>
class 的用户只需编写 BArray.Create(values)
,它将适用于您定义的 int[]
、double[]
等类型的 values
。