分類:[VB.NET/VB2005 以降]
環境:Win8.1Pro + VS2008 Standard Edition SP1 + .NET3.5 SP1
現在、VB6で開発されたアプリケーションをVB.NET2008にアップグレードしているのですが、
その際に以下のコードでVB6とVB.NETで動作が異なっています。
回避方法については、いくつか案があり、回避できることは分かっているのですが、
上に報告する際に、なぜそのような事が起きているか理由が分からず、困っています。
対象の処理の確認用のミニマムコードは以下の通りです。
(実際の処理とは文字が異なりますが結果は同じです。)
Dim flg As Boolean
flg = ("一田" Like "?*一田")
この処理で変数flgに代入これがVB6ではFalseになり、VB.NETではTrueになりました。
ちなみに確認のため、以下のサンプルプログラムをVB6とVB.NETで実行しました。
(現在VB6の環境は現在手元になく、元のソースとEXEファイルしかないので、
VB6での以下のサンプルプログラムおよび上記ミニマムコードの実行は、
Win7上のExcel2010のVBAにて確認しました。)
===========================
Dim moto As String
Dim pattern As String
moto = "一田"
pattern = "?*一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
pattern = "*?一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
pattern = "一田*?"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
pattern = "一田?*"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
moto = "山一田"
pattern = "?*一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
pattern = "*?一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
pattern = "一田*?"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
pattern = "一田?*"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
===========================
VB6では以下のような結果が得られました。
"一田" like "?*一田":False
"一田" like "*?一田":False
"一田" like "一田*?":False
"一田" like "一田?*":False
"山一田" like "?*一田":True
"山一田" like "*?一田":True
"山一田" like "一田*?":False
"山一田" like "一田?*":False
VB.NETでは以下のような結果が得られました。
"一田" like "?*一田":True
"一田" like "*?一田":False
"一田" like "一田*?":False
"一田" like "一田?*":False
"山一田" like "?*一田":True
"山一田" like "*?一田":True
"山一田" like "一田*?":False
"山一田" like "一田?*":False
この結果から?と*の位置によって動作が異なるようですが
Like演算子のヘルプを見てもこれに関する情報は見当たりませんでした。
(参照ヘルプ:http://msdn.microsoft.com/ja-jp/library/swf8kaxw(VS.90).aspx )
また上記サンプルプログラムの変数motoおよび変数patternに代入される「一田」を
すべて「田」に全置換して実行すると、
VB6とVB.NETの処理結果が上記VB6の処理結果と同様となり、一致しました。
(文字数の影響もありそうですが、今回の対象の処理では2文字ですので・・・)
#蛇足ですが、
#VB2008によるアップグレードウィザードによってアップグレードした際には
#このLikeによる処理について、特にUpgradeWarning等のレポートはありませんでした。
上記について、理由またはこれに関する資料が記載されているページ等をご存じの方、
お教え願えないでしょうか?
もちろん、それ以外の細かい情報(推測等)や他にチェックすべき項目等でも構いません。
よろしくお願いします。
|