投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/8/19 11:13:26
この問題は、
 If e.KeyCode = Keys.Enter Then
が、
 If e.KeyCode = System.Windows.Forms.Keys.Enter Then
 If e.KeyCode = OpenQA.Selenium.Keys.Enter Then
のいずれの意味で解釈されるのか…という話です。

どちらに解釈されるかは曖昧ですが、今回のケースでは、
System.Windows.Forms 名前空間は「プロジェクトのプロパティの参照タブ」で
プロジェクト全体に対してインポートされた物であるのに対し、
OpenQA.Selenium 名前空間は、Form1.vb ファイル限定のインポートなので
OpenQA.Selenium 側の方が優先度が高くなった結果生じた問題です。


e.KeyCode の型は System.Windows.Forms.Keys 列挙型なので、「数値」の一種です。
一方、OpenQA.Selenium.Keys.Enter は String 型であり、値は ChrW(&HE007) です。
https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/src/webdriver/Keys.cs#L65-L68

※ちなみに E007 は Unicode で定義されていない無効文字です。


If e.KeyCode = Keys.Enter Then
において、左辺は列挙値なので、「数値」の一種となり、
それを右辺の文字列と比較しようとしているものと解釈されています。

Option Strict On の場合は、コンパイルエラーとして
BC30512「Option Strict On では 'String' から 'Double' への暗黙的な変換は許可されていません。」
となるでしょう。

Option Strict Off の場合は、実際に実行された時に検出されて
「System.InvalidCastException: 'String "" から型 'Double' への変換は無効です。」
の例外が発生します。