VB到C#将属性转换为int cast

时间:2013-10-24 10:52:58

标签: c# vb.net properties

原创(作品):

Dim fnt As Drawing.Font = New Drawing.Font( _
  rtf.SelectionFont.FontFamily, _
  rtf.SelectionFont.Size, _
  DirectCast(rtf.SelectionFont.Style _
  + If(rtf.SelectionFont.Underline, _
  -Drawing.FontStyle.Underline, _
  Drawing.FontStyle.Underline), _
  Drawing.FontStyle) _
)

translation()无法将FontStyle转换为int:

System.Drawing.Font fnt = new System.Drawing.Font(
  rtf_Renamed.SelectionFont.FontFamily, 
  rtf_Renamed.SelectionFont.Size,
  (System.Drawing.FontStyle)(
    rtf_Renamed.SelectionFont.Style 
    + rtf_Renamed.SelectionFont.Underline 
    ? -System.Drawing.FontStyle.Underline  //cannot cast to int
    : System.Drawing.FontStyle.Underline
  )
);

那么如何将这些.NET属性转换为它们的数值?

2 个答案:

答案 0 :(得分:4)

我相信你的代码尝试做的是添加下划线,如果原件没有加下划线,否则将其删除。

但是应该对FontStyle进行位掩码,以便切换下划线部分。 您不应该执行算术加法和减法,因为如果原始样式设置了任何其他属性,这将无法正常工作。

你必须做一个DirectCast的事实是一个警钟,说有些事情可能不对。

你的VB代码应如下所示:

Dim fnt As Drawing.Font = New Drawing.Font(rtf.SelectionFont.FontFamily, 
                                           rtf.SelectionFont.Size, 
                                 rtf.SelectionFont.Style XOr FontStyle.Underline)

所以C#等价物应该是这样的:

Drawing.Font fnt = new Drawing.Font(rtf.SelectionFont.FontFamily, 
                                    rtf.SelectionFont.Size, 
                                 rtf.SelectionFont.Style ^ FontStyle.Underline);

有关此问题的背景信息,请参阅此问题:How to set multiple FontStyles when instantiating a font?

答案 1 :(得分:2)

rtf.SelectionFont.Style +...位错误。原始VB代码应转换为:

Dim fnt As Drawing.Font = New Drawing.Font( _
  rtf.SelectionFont.FontFamily, _
  rtf.SelectionFont.Size, _
  DirectCast(rtf.SelectionFont.Style XOr If(rtf.SelectionFont.Underline, _
  -Drawing.FontStyle.Underline, _
  Drawing.FontStyle.Underline), _
  Drawing.FontStyle) _
)

直接转换为C#时出现此错误的原因是,在FontStyle中,Underline接受直接转换为整数(请注意下面),并附带所有规则(+/-符号)。在C#中你不能这样做,因此上面的代码不能完全复制(减去部分,实际上将Strikeout转换为System.Drawing.Font fnt = new System.Drawing.Font( rtf_Renamed.SelectionFont.FontFamily, rtf_Renamed.SelectionFont.Size, (System.Drawing.FontStyle)(rtf.SelectionFont.Style ^ rtf_Renamed.SelectionFont.Underline ? System.Drawing.FontStyle.Strikeout : System.Drawing.FontStyle.Underline ) ); )。转换后的C#代码:

FontType

澄清

正如通过评论所指出的那样,原始VB代码执行隐式转换(从IntegerSelectionFont.Underline),这实际上不应该进行。理想情况下,这两个代码都应该依赖于适当的类型,因此需要FontStyle.StrikeoutInteger,或者执行相应的转换为FontStyle

注意FONTSTYLE / ENUMS / CAST / VB

Enum是System.Drawing.FontStyle类型的Option Strict Off。通过执行相应的强制转换/转换,可以通过整数访问枚举的属性(除非在VB.NET中有{{1}},这是不值得推荐的)。因此,理论上,OP版本的VB版本甚至不应该使用Option Strict On进行编译,但确实如此!这个特定的配置(DirectCast中的条件)似乎没问题,即使使用Option Strict On!没有真正影响的轶事(你应该总是施放并依赖于Option Strict On),但它非常好奇。