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)