我试图设置一个使用整数值的枚举属性,例如

Graphics g = this.CreateGraphics();
int enumValue = 2; // corresponds to SmoothingMode.HighQuality
g.SmoothingMode = (SmoothingMode)2; // does not have expected result
// also tried:
SmoothingMode sm = (SmoothingMode)Enum.ToObject(typeof(SmoothingMode), enumValue); // works correctly
g.SmoothingMode = sm; // still doesn't work!


但是对象的属性永远不会设置为正确的枚举值。我已经通过VS2010的调试器运行了此程序,并且Enum.ToObject的强制转换和/或使用正常运行,但是在分配后,例如,g.SmoothingMode是AntiAlias而不是HighQuality。实际上,无论我使用什么数字,赋值总是会导致将AntiAlias(等于3的整数)或None(等于4的整数)分配给对象的属性。

当枚举是影响转换和赋值的类的属性时,或者对于Graphics.SmoothingMode只是有些奇怪,还是什么呢?

最佳答案

看一下SmoothingMode Enumeration描述。

引用:


  Default,None和HighSpeed是
  等效并指定渲染
  没有应用平滑。
  
  抗锯齿和高品质是
  等价并指定渲染
  应用平滑。


因此,基本上有三种模式:


抗锯齿渲染(HighQualityAntiAlias
无抗锯齿(DefaultNoneHighSpeed
无效(Invalid


您的代码中的枚举没有问题。以下行是合法的。

g.SmoothingMode = (SmoothingMode)2;


它只是在内部像对待HighQuality一样对待AntiAlias

如果您这样做:

g.SmoothingMode = SmoothingMode.HighQuality;
var x = g.SmoothingMode;


x将返回SmoothingMode.AntiAlias,因为这基本相同。

10-06 16:00