エンジンでファクトを論理的にモデル化する方法と、.NET コードでオブジェクトをモデル化する方法の間にはインピーダンスの不一致があり、この影響の 1 つは、静的メソッドの呼び出しの問題です。Xiao Han の説明に従って StaticSupport フラグを設定すると、エンジンはその動作を変更し、静的メソッドを組み込み関数または述語であるかのように扱います。ただし、デフォルトでは、エンジンは静的メソッドをファクトの動作として扱います。物理的には、ファクトはエンジンの作業メモリ内のオブジェクトであり、メソッドを使用する前に各ファクトをエンジンにアサートする必要があります。したがって、DateTime で静的な Now プロパティ ゲッターを呼び出すには、まず DateTime オブジェクトをエンジンにアサートする必要があります。もちろん、DateTime は値型 (構造体) ですが、それで問題ありません。ルール セットを実行すると、オブジェクトとして単一のファクトをアサートするか、オブジェクト配列としてファクトのコレクションをアサートします。.NET は、この方法で渡された DateTime を自動的にボックス化 (内部的にオブジェクトとしてラップ) します。
そのオブジェクトの型で静的メソッド (または、この場合は、もちろん、実際にはメソッドであるプロパティ ゲッター) を呼び出すために、エンジンにオブジェクトをアサートする必要があるのは気が狂っているように思えます。デフォルトで静的メソッドをビルトインとして扱うようにエンジンを構築した方がよかったのかもしれません。しかし、そうではありませんでした。さらに、Microsoft が StaticSupport フラグを個々のルール セットまたは個々のルールのレベルで実装していれば、はるかに優れていたでしょう。このようにレジストリに実装する (マシン レベル) か、代わりに .config ファイル (アプリケーション レベル; use ) で構成すると、実際の問題が発生する可能性があります。国旗。
Static Support は「2」に設定することもできます。この場合、パラメーターなしで静的メソッドを呼び出した場合、または定数値のみを指定して呼び出した場合、条件の述語として、または別の関数の引数として呼び出した場合、エンジンは静的メソッドを評価します。メンバーを 1 回だけ呼び出し、結果をキャッシュします。