1

我有一个泛型结构和两个定义泛型类型参数的同义词。我想像这样定义这两种类型之间的类型转换:

using X = A<int>;
using Y = A<long>;

struct A<T>
{
    private T data;

    public A(T data)
    {
        this.data = data;
    }

    public static explicit operator X(Y value)
    {
        return new X((int)value.data);
    }
    public static implicit operator Y(X value)
    {
        return new Y(value.data);
    }
}

这是我想如何使用结构的示例:

class Program
{
    static void Main(string[] args)
    {
        X x = new X(1);
        Y y = new Y(2);

        x = (X)y; // explicit cast with precision loss
        y = x; // implicit cast without precision loss
    }
}

不幸的是,每个“使用”都会创建结构的新特定定义,C# 编译器不会将同义词结构视为通用结构的子集,而是将其视为单独的结构。这就是编译器报告错误的原因:

  1. “X.static 隐式运算符 Y(X) 和 Y.static 隐式运算符 Y(X) 之间存在歧义”。
  2. “用户定义的转换必须转换为封闭类型或从封闭类型转换”。

有谁知道在不将类型更改为类的情况下实现这种类型转换的方法?

更新:我正在使用 .NET 4。

4

1 回答 1

1

错误

用户定义的转换必须与封闭类型相互转换。

意味着您的转换运算符需要转换为/从A<T>. 你的正在转换为/从A<int/string>. 那不是一回事(至少不那么普遍)。

所以这行不通。您必须找到其他方法来进行转换。也许运行时强制转换在这里可以提供帮助(将操作符定义为在它们上进行操作并在A<T>其中进行强制转换)。

我认为这个问题与类型同义词无关。事实上,他们使这个问题更难理解。

于 2013-06-04T09:38:22.773 回答