c# - 编译时向量数学维度一致性检查

标签 c#

我正在用 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/

相关文章:

c# - 开发文件存储 Web 应用程序

c# - 如何在 WebGrid 中禁用分页

c# - 如何在 MenuStrip LayoutStyle 设置为 Flow 的情况下将某些 MenuItems 右对齐?

c# - 在 C#.NET 中使用正则表达式从字符串中提取数据

c# - 如何在句子文本中搜索单词 [C#]

c# - 如何与微服务共享 Web API Controller

c# - Windows 商店应用程序中的计时器在哪里?

c# - 是由偏离水平面大于 45 度的两点组成的线

c# - GIT 智能 HTTP 协议(protocol)的服务端和客户端有哪些细节区别

c# - 删除/隐藏图例图表 excel