具有泛型的C#隐式运算符

Mur*_*tný 3 c# generics implicit-cast

我正在用C#编写枚举的抽象包装(我想要类似Vala中的枚举的东西)。我的代码是:

    public abstract class Wraper<T, TE>
        where T : Wraper<T, TE>, new()
    {
        public TE Value;

        public static implicit operator T(TE value)
        {
            return new T() { Value = value };
        }

        public static implicit operator TE(T value)
        {
            return value.Value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

    public enum EFoo { A, B, C, D, E};
    public class Foo : Wraper<Foo, EFoo>
    {
        public bool IsBla
        {
            get { return Value == EFoo.A || Value == EFoo.E; }
        }
    }

    ...

    Foo foo = EFoo.A;
    bool bla = foo.IsBla;
Run Code Online (Sandbox Code Playgroud)

但是代码无法编译,因为C#不允许同时使用这两个通用参数。编译时报告错误:

User-defined conversion must convert to or from the enclosing type
Run Code Online (Sandbox Code Playgroud)

上线

public static implicit operator T(TE value)
Run Code Online (Sandbox Code Playgroud)

在C#中或围绕C#进行的工作不是那么简单吗?

Gra*_*x32 10

隐式运算符必须在定义它的类之间进行转换。由于您试图在抽象基类中进行定义,因此它只能在该类之间进行转换。

该行Foo foo = EFoo.A;不起作用,因为您无法在抽象类中定义该转换,而只能在Foo类中对其进行定义。

如果您像下面所做的那样更改了代码,以进行基类之间的转换,则隐式转换有效,但是您无法获得所需的结果。 Wraper<Foo,EFoo> foo2 = EFoo.A;之所以有效,是因为可以在基类中定义它。

最好的办法可能是在创建foo Foo foo = new Foo { Value = EFoo.A };或创建一些通用转换函数时使用初始化程序语法。

public abstract class Wraper<T, TE>
    where T : Wraper<T, TE>, new()
{
    public TE Value;

    public static implicit operator TE(Wraper<T, TE> value)
    {
        return value.Value;
    }

    public static implicit operator Wraper<T, TE>(TE value)
    {
        return new T { Value = value };
    }
}

public enum EFoo
{
    A,
    B,
    C,
    D,
    E
}

;
public class Foo : Wraper<Foo, EFoo>
{
    public bool IsBla
    {
        get
        {
            return Value == EFoo.A || Value == EFoo.E;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)