具有泛型

时间:2015-09-11 08:38:53

标签: 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;
        }
    }

我想做的事情是这样的:

    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;

但代码无法编译,因为C#不允许这两个泛型参数。编译时报告错误:

User-defined conversion must convert to or from the enclosing type

在线

public static implicit operator T(TE value)

是否有任何解决方法或在C#中不是那么简单?

2 个答案:

答案 0 :(得分:3)

隐式运算符必须从或定义它所定义的类。由于您试图在抽象基类中定义它,它只能从或转换为该类。

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;
        }
    }
}

答案 1 :(得分:-4)

您不能对通用类型使用隐式。