我正在用 C# 创建一个线性代数库,我想在编译时强制出现维度不一致错误。我已经实现了与 this 类似的解决方案,其中我使用的特征是一个唯一映射到整数的类。问题是对于我希望 Vectors 具有的每种可能的大小,我需要创建一个具有唯一名称的类来表示它。
这是该实现的示例:
public class Vector<T> where T: ISize, new()
{
static readonly T size = new T();
List<double> values;
public Vector(List<double> values)
{
if (values.Count != size.Size)
throw new IndexOutOfRangeException();
this.values = new List<double>(values);
}
public double Get(int index)
{
return values[index];
}
public Vector<T> Add(Vector<T> other)
{
var vv = new List<double>();
for (int ii = 0; ii < size.Size; ++ii)
vv.Add(other.Get(ii) + this.values[ii]);
return new Vector<T>(vv);
}
}
public interface ISize
{
int Size { get; }
}
public class S1 : ISize
{
public int Size
{
get { return 1; }
}
}
public class S2 : ISize
{
public int Size
{
get { return 2; }
}
}
下面是它的用法示例:
class Program
{
static void Main(string[] args)
{
var v1 = new Vector<S2>(new List<double>() { 1, 2 });
var v2 = new Vector<S2>(new List<double>() { 10, -4 });
var z1 = new Vector<S1>(new List<double>() { 10 });
// works
var v3 = v1.Add(v2);
// complie-time error
var z2 = z1.Add(v1);
}
}
这对我的目的来说效果很好,除了我需要为每个可能的 Vector 大小创建不同的 ISize 实现之外。我有什么方法可以实现 Vector 类来解决这个问题吗?
最佳答案
为了得到编译时错误,你需要有不同的类型。 C# 没有让你定义一个类型参数的概念,它本身采用一种值参数 - 这是你需要做的。
因此,我不认为你所问的是可能的。
我认为可能有一种方法可以使用匿名类型为 vector 实例系列创建唯一类型,但这会很古怪,我认为它不会提供您想要的类型安全。
C++在模板中有这样的概念(所以不是没有道理),只是在C#中不可能。
关于c# - 编译时向量数学维度一致性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27282025/