Delphi W1050 set 式で WideChar がバイト char に縮小されました

 Delphi で
「W1050 set 式で WideChar がバイト char に縮小されました。'SysUtils' ユニットの 'CharInSet' 関数で使用することを検討してください。」
なる警告

こういった関数を作成すると出現するエラー
function CharInSetEx(C: WideChar; CharSet: TSysCharSet): Boolean;
begin
    Result := C in CharSet;
    // Result := System.SysUtils.CharInSet(C, CharSet);
end;

CharInSetEx('あ', ['あ', 'A'])
CharInSet とか関係なく、この関数に入った時点で 配列 CharSet の値が 0-255 に丸められてしまうため、 ASCII以外の文字列を 変数CharSetへ与えてもヒットしない
これは  TSysCharSet の定義(set of AnsiChar)である、集合型が0-255の範囲しか利用できないことに由来しています

この場合 array of  WideChar を使用して同様の引数で WideChar の処理を行うことが可能です(サロゲートペア除く)
ただし、CharSet: array of WideChar = ['A'] のようなデフォルト引数を利用することは不可能になります(overloadで同様の事が可能な場合があります) 
function CharInSetEx(C: WideChar; CharSet: array of WideChar): Boolean;
begin
    Result := System.WideStrUtils.InOpArray(C, CharSet);
end;

CharInSetEx('あ', ['あ', 'A'])

コメント