Chr*_*Dog 33 c# enums operator-overloading operators
我有一个枚举类型,我想定义的>,<,>=,和<=运营商.我知道这些运算符是在枚举类型的基础上隐含创建的(根据文档)但我想明确定义这些运算符(为了清晰,控制,知道如何操作等等)
我希望我可以这样做:
public enum SizeType
{
Small = 0,
Medium = 1,
Large = 2,
ExtraLarge = 3
}
public SizeType operator >(SizeType x, SizeType y)
{
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用("意外的令牌")......这可能吗?它似乎应该是因为有隐含定义的运算符.有什么建议?
Meh*_*ari 32
你不能这样做.您只能为您定义的类和结构提供重载运算符 - 并且至少有一个参数应该是类或结构本身的类型.也就是说,您可以声明一个重载的加法运算符,它添加了一个MyClassto,MyEnum但是您永远不能使用两个MyEnum值.
Bor*_*sky 23
正如前面提到的其他人,不能覆盖Enums上的运算符,但你可以在struct上执行.请参阅下面的示例.如果有帮助,请告诉我:
public struct SizeType
{
private int InternalValue { get; set; }
public static readonly int Small = 0;
public static readonly int Medium = 1;
public static readonly int Large = 2;
public static readonly int ExtraLarge = 3;
public override bool Equals(object obj)
{
SizeType otherObj = (SizeType)obj;
return otherObj.InternalValue.Equals(this.InternalValue);
}
public static bool operator >(SizeType left, SizeType right)
{
return (left.InternalValue > right.InternalValue);
}
public static bool operator <(SizeType left, SizeType right)
{
return (left.InternalValue < right.InternalValue);
}
public static implicit operator SizeType(int otherType)
{
return new SizeType
{
InternalValue = otherType
};
}
}
public class test11
{
void myTest()
{
SizeType smallSize = SizeType.Small;
SizeType largeType = SizeType.Large;
if (smallSize > largeType)
{
Console.WriteLine("small is greater than large");
}
}
}
Run Code Online (Sandbox Code Playgroud)
Woj*_*teq 18
根据ECMA-335共同语言基础设施:
CTS支持枚举(也称为枚举类型),即现有类型的备用名称.出于匹配签名的目的,枚举不应与基础类型相同.然而,枚举的实例应该可分配给基础类型,反之亦然.也就是说,不需要强制转换(参见§8.3.3)或强制(参见§8.3.2)从枚举转换为基础类型,也不需要从基础类型到枚举.枚举比真实类型更受限制,如下所示:它应该只有一个实例字段,该字段的类型定义枚举的基础类型.
- 它不应该有任何自己的方法.
- 它应从System.Enum派生(参见Partition IV Library - Kernel Package).
- 它不应该实现它自己的任何接口.
- 它不应具有任何属性或事件.
- 它不应该有任何静态字段,除非它们是字面的.(见§8.6.1.2)
我们假设我们有以下IL代码:
.class public auto ansi sealed Test.Months extends [mscorlib]System.Enum
{
.field public specialname rtspecialname int32 value__
.field public static literal valuetype Test.Months January = int32(0x00000001)
.field public static literal valuetype Test.Months February = int32(0x00000002)
.field public static literal valuetype Test.Months March = int32(0x00000003)
// ...
.method public hidebysig specialname static valuetype Test.Months
op_Increment(valuetype Test.Months m) cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.s 10
IL_0003: add
IL_0004: ret
}
} // end of class Test.Months
Run Code Online (Sandbox Code Playgroud)
MSIL编译器(ilasm.exe)将生成以下错误:
error -- Method in enum ***** FAILURE *****
所以我们不能重载enum运算符甚至编辑IL代码;)
Bri*_*sen 12
正如Mehrdad所说,你不能在枚举本身上这样做.但是,您可以制作一些适用于枚举的扩展方法.这将使它看起来像枚举上的方法.
static bool IsLessThan(this SizeType first, SizeType second) {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24474 次 |
| 最近记录: |