misc.log

日常茶飯事とお仕事と

C#7.0のValueTupleとStyleCopのシンタックスエラー

Visual Studio 2017 + .NET Framework 4.7でC# 7.0を使った開発で、複数の値のペア(2組以上もOK)を一度に扱える「Value tuple(バリュータプル)」を用いた場合、コードチェック用ツール「StyleCop」がシンタックスエラーを返してしまうようです。

SA0102 : CSharp.CsParser : A syntax error has been discovered in file C:\Work*****

このことはGitHubのStyleCopでもIssueとして報告されています。

github.com

ValueTupleやTupleでは、複数の値を用意した場合、特に指定しなければそれぞれの要素は「Item1、Item2……」というようなプロパティが自動で作られるのですが、ValueTupleではこのいまいちなプロパティに独自で名前をつけることができます。この「命名機能」を使うとStyleCopが「そんな書式は知らん!」とシンタックスエラーを吐くみたいで。

とりあえずこれ自体はスルーしちゃってもC#の記法としては問題無いのですが、残念ながら現バージョンのStyleCopはここでエラーが出ると、それ以降のチェックを投げ出して終了してしまうようです。なので、ValueTupleのエラーを無視するにしても、いったんは名前無しでItem1、Item2といった味気ないバージョンに変更すればStyleCopも知ってる書式としてスルーしてくれるようです。このとき、括弧だけの書き方ではなく、以下のようにValueTupleと明記しないと同じエラーが出ます。

// メソッド戻り値として使う場合……
// StyleCopに叱られる書き方1
private (string message, int errorCode) GetErrorInfo()

// StyleCopに叱られる書き方2
private (string, int) GetErrorInfo()

// StyleCopに叱られない書き方
private ValueTuple<string, int> GetErrorInfo()

この「叱られない書き方」に書き換えて、StyleCopを再実行しないと全体のコードチェックが実行されません。案外、他にも書式エラーがたんまりあって、単にそれが通知されていないだけ、ってケースがあるのでご注意を。

参考まで。

More Effective C# 6.0/7.0

More Effective C# 6.0/7.0

C# 7.0 Pocket Reference: Instant Help for C# 7.0 Programmers

C# 7.0 Pocket Reference: Instant Help for C# 7.0 Programmers