我正在为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#中不是那么简单?
答案 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)
您不能对通用类型使用隐式。