首页 > 解决方案 > 通用结构的转换运算符是否合法?

问题描述

问题是:通用结构的转换运算符是一个可行的选择还是只是一个定义不足的极端情况?

我在这里的具体用例情况是我有一组结构来表示物理 SI 单位类型(每个类型都有显式运算符和它们之间的转换运算符)。它工作得很好,直到出现了为它们制作通用 3d 向量的新要求 + 使用转换运算符来支持可读的算术语法 ( (m)1.3 + (km)0.041)。

但。CS0556告诉我"conversion must convert to or from enclosing type"——这一切都很好,直到人们意识到这对于通用结构来说甚至是不可能的。因为虽然VECTOR<km>和之间的转换在VECTOR<T>技术上可能是合法的定义 - 如果你不知道这两种类型,那几乎没有用处。

public struct VECTOR<T>
{
    public double3 Value;

    // I wanted to define all possible conversions this way, but suddenly:
    // (CS0556) user-defined conversion must convert to or from enclosing type
    public static implicit operator VECTOR<m> ( VECTOR<km> val ) => new VECTOR<m>{ Value = val.Value * 1e+3 };
}

我知道这可以重构为类 - 但我需要将其保留为结构。并且可以将转换重构为方法 - 但运算符最类似于数学且可读性强,我想保留它们。看起来像一个死胡同。有什么想法、想法吗?

标签: c#genericsstruct

解决方案


推荐阅读