原创(作品):
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属性转换为它们的数值?
答案 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代码执行隐式转换(从Integer
到SelectionFont.Underline
),这实际上不应该进行。理想情况下,这两个代码都应该依赖于适当的类型,因此需要FontStyle.Strikeout
和Integer
,或者执行相应的转换为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),但它非常好奇。