1

オリジナル(作品):

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 プロパティを数値にキャストする方法は?

4

2 に答える 2

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);

これに関する背景については、この質問を参照してください:フォントをインスタンス化するときに複数の FontStyles を設定する方法は?

于 2013-10-24T11:08:21.877 に答える
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# に直接変換するときにこのエラーが発生する理由は、VBFontStyleでは、すべての規則 (+/- 記号) を使用して、整数への直接変換 (以下に注意) を受け入れるためです。C# では同じことを行うことができないため、上記のコードを正確に複製することはできません (実際には に変換Underlineされるマイナス部分Strikeout)。変換された C# コード:

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
  )
);

明確化

コメントで指摘されているように、元の VB コードは暗黙的な変換 ( からFontTypeInteger) を実行しますが、これは実際には実行されるべきではありません。理想的には、両方のコードが適切な型に依存する必要があるため、SelectionFont.UnderlineおよびFontStyle.Strikeoutまたは に対応するキャストを実行しIntegerます。

FONTSTYLE/ENUMS/CAST/VB に関する注意事項

FontStyleEnumSystem.Drawing.FontStyle 型です。Enum のプロパティは、対応するキャスト/変換を実行することにより、整数を介してアクセスできます ( Option Strict OffVB.NET にある場合を除き、推奨されません)。したがって、理論的には、OP のコードの VB バージョンは Option Strict On でコンパイルすることすらできませんが、そうです! Option Strict On を使用しても、この特定の構成 (DirectCast 内の状態) は問題ないようです。実際の影響のない逸話的な事実 (常にキャストして Option Strict On に依存する必要があります) ですが、これは非常に興味深いものです。

于 2013-10-24T11:26:33.163 に答える