C#を使っていて消せない警告の一覧です。
気付いた時に随時追加していくつもりです。
概要
8月16日の++C++;管理人の岩永さんの放送で話題になったので記事を建ててみました。
https://youtu.be/-_QGGvT5FEw?t=6485
もちろん#pragma warning disable
で消せますが、それは無視します。
一覧
CS0067:イベント 'event' は使用されません
これは説明通り、イベントを作ったけど使ってない時に出る警告です。
もちろん消せるなら消せば良いんですが、イベントを含むinterfaceを継承した場合は消せませんね。
実は消せるんですかね?
public class ShowMessageCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
Application.ShowMessage(parameter?.ToString());
}
}
CS0612: 'member'は古い形式です
これは[Obsolete]
をマークしたメンバーを参照した時に出る警告です。
当然避けるべきですが、互換性維持や移行目的で旧コードにアクセスしなければいけない場合どれか一つ警告が残さないといけなかったりします。
CS1998: この非同期メソッドには「await」演算子がなく、同期して実行されます。
この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を使用してバックグラウンドのスレッドに対して CPU 主体の処理を実行することを検討してください。
async
を使う人はこれに困っている人が多いんじゃないでしょうか。
言っておきますが、ほとんどの場合これは消せます。というか一応全て消せるはずです。
具体的にはTask.CompletedTask;
やTask.FromResult();
を使います。
Func<Task> a = async () => { DoSomething(); };
Func<Task<bool>> b = async () => true;
これらは以下に書き換えられます。その内リファクタリング機能が対応するでしょう。
Func<Task> a = () => {
DoSomething();
return Task.CompletedTask;
};
Func<Task<bool>> b = () => Task.FromResult(true);
でもちょっと冗長ですよね。
例えばこれ
DoSomething(async (_)=>(null,null));
とこれ
DoSomething(_ => Task.FromResult<(Func<bool> FirstResult, Func<bool> SecondResult)>((null, null)));
だと前者を使いたくなりますよね。
これはタプルにデリゲートが絡んだ例で、型推論が効かないケースです。単なるタプルなら利いてくれたりするんですけど。
個人的に最近あった例で、その時は全部(null,null)
だったので一か所にまとめましたが、そうじゃなかったら警告を残してました(別にタプルを返す関数を作れば良いけど)。
2021年10月30日追記:
現時点でもやはり型推論は効いてません。Sharplab。
参照コンポーネント 'Microsoft.VCLibs' が見つかりませんでした。
最近しばらく出てる警告。謎です。
参照を消せば動きませんし、ほっとけば問題が出ないんで放置してます。
一応の対策としては「Nugetパッケージの復元」「ソリューションのクリーン」「.vsフォルダの削除」あたりが標準的だと思います。
最近気になってるので載せましたがこの記事の性質とはちょっと離れてますね。
Xamarin Formsでの記事。
でもこの手の謎警告で消せない場合ってたまにあります。