- 投稿日:2019-04-03T15:21:44+09:00
C#でビルド時にCS0006 メタデータが見つかりませんでしたエラーが出たときの対処
はじめに
- とあるC#のソリューションを、別PCから持ってきてリビルドしようとするとエラーとなった
- 対処方法を備忘用に記録
エラーの内容
- リビルド時のエラーメッセージは以下のもの
- dllの参照設定は実施しなおしたが、エラーは継続して発生するので、どこかに古い設定が残ってしまっているのかも
CS0006 メタデータが見つかりませんでした 引越し前PCのローカルパス\参照しているdll古い設定の場所
- 確認してみるとcsprojファイルに以下設定が存在していた
<ItemGroup> <Analyzer Include="引越し前PCのローカルパス\参照しているdll"/> </ItemGroup>対応方法
- Analyzer Includeの設定が不要なので、テキストエディタで適当に削除
- 削除後に改めてリビルドすると、正常に実行できた
まとめ
- csprojファイルの古い設定に気をつけよう
- 投稿日:2019-04-03T11:23:31+09:00
Visual Studio 2019 になって地味にうれしいこと
Visual Studio 2019 登場!
なんと、プロジェクト作成時の言語バージョンの規定値が『サポートされる最新の C# マイナーバージョン』になっている!
なぜ今までこうなっていなかったんだ的な機能なんですが、個人的にはとてもうれしい。
最新版を使いたい人にとっては、マイナーバージョンであれ公式リリースされたC#は常に取り込みたく、なぜ最新を選んだのに「C#7.0」で止まるんだろう、なんて常日頃思っていました。破壊的変更には慎重なはずのC#ですから、言語のマイナーバージョンアップくらいで既存のコードにダメージはほとんどないですし。もちろん、
latestmajor
設定にすれば今まで通りの設定になりますし、言語バージョンに対して保守的な場所では特定の C# バージョンを選ぶことができます。そんな場合はプロジェクト作成時に必ず設定を行いましょう。C#8.0は?
ちなみに、C#8.0 は未だにプレビューバージョンですが、これは既定路線。
再帰パターン、非同期ストリームあたりは問題なく動いているみたいですが、インタフェースの既定実装あたりはまだ搭載されてすらいなさそう。
null許容/非許容参照型は、表面だけ触ると動いているようにみえる(何か記事を書きたい)けれど、大規模なプロジェクトできちんと動くかが重要なので、その辺が詰められているのかはまだよく分かりません。
- 投稿日:2019-04-03T01:02:26+09:00
プログラム初心者のためのC#入門 #3
#3 演算子
例えば
a + b
のような式があったとして,+ を演算子(オペレーター),a や b を被演算子(オペランド)といいます.算術演算子
Operator.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Operator { class Program { static void Main(string[] args) { int operand1 = 5; int operand2 = 2; int a = operand1 + operand2; // 加算.aは7. int b = operand1 - operand2; // 減算.bは3. int c = operand1 * operand2; // 乗算.cは10. int d = operand1 / operand2; // 除算.dは2. int e = operand1 % operand2; // 除算の剰余.eは1. } } }
*
や%
はちょっと慣れないかもしれませんね.あと,/
は整数型同士の演算の場合,小数点以下は切り捨てられるというところも注意です.
また,今回はint型同士でサンプルコードを書きましたが,double型同士や,int型やdouble型など違う型同士の演算もどうなるかやってみてください.インクリメント・デクリメント
Operator.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Operator { class Program { static void Main(string[] args) { int a = 2; int b = a++; // aは3.bは2. a = 2; b = a--; // aは1.bは2. a = 2; b = ++a; // aは3.bも3. a = 2; b = --a; // aは1.bも1. } } }
a++
,++a
はaに1加算します.これをインクリメントと言います.また,a--
,--a
はaから1減算します.これをデクリメントと言います.インクリメント,デクリメントはそれぞれ,前置きと後置きがあり,これによってインクリメント,デクリメントのタイミングが変わります.たとえば,a++
は後置きなので,演算が終わってからインクリメントされます.反対に,++a
は前置きなので,インクリメントされてから演算されます.論理演算子
Operator.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Operator { class Program { static void Main(string[] args) { bool a = true & false; // 論理積.aはfalse. bool b = true | false; // 論理和.bはtrue. bool c = true ^ false; // 排他的論理和.cはfalse. bool d = !true; // 否定.dはfalse. int e = ~43; // 1の補数.eは-44. } } }
!
はbool型のみ,~
は整数型のみ,&
,|
,^
はbool型に加えて整数型にも適用できます.また,&&
,||
でbool値のAND,ORの意味になります.シフト演算子
Operator.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Operator { class Program { static void Main(string[] args) { int a = 45 << 3; // aは360. int b = 45 >> 2; // bは11. } } }45を2進数で表すと101101です.シフト演算子はこれを何ビット分かずらします.
45 << 3
は,3ビット分だけ左にシフトするので101101000,つまり360となり,45 >> 2
は,2ビット分だけ右にシフトするので1011,つまり11となります.代入演算子
Operator.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Operator { class Program { static void Main(string[] args) { int a = 8; // aは8. a += 5; // aは13. a -= 5; // aは8. a *= 5; // aは40. a /= 5; // aは8. a %= 5; // aは3. } } }まず
=
ですが,これは前も紹介した通り,右の被演算子を左の被演算子に代入するというもので,数学などで右辺と左辺が等しいという意味で使われるイコールではありません.
次に,算術演算子に=が付いたものですが,これは左の被演算子に右の被演算子を演算子で演算した結果を左の被演算子に代入するというものです.はい,わけわかりません.a += 5
を例に挙げてみましょう.これを簡単な形にするとa = a + 5
です.aとa + 5が等しいわけないじゃないか!と思う方もまだいるかもしれませんが,=は代入演算子なので等しいという意味は全くありません.aにa + 5の値を代入しているだけです.aを二度書くのが面倒なのでより簡単に書けるようにした感じですね.ちなみに,算術演算子以外にも&=
,|=
,^=
,<<=
,>>=
のように!
と~
を除く論理演算子やシフト演算子にも適用できます.関係演算子
Operator.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Operator { class Program { static void Main(string[] args) { bool a = (3 == 7); // aはfalse. bool b = (3 != 7); // bはtrue. bool c = (3 < 7); // cはtrue. bool d = (3 > 7); // dはfalse. bool e = (3 <= 7); // eはtrue. bool f = (3 >= 7); // fはfalse. } } }先ほど
=
は等しいことを示す演算子ではないことを説明しましたが,プログラムの世界で二つの値が等しいか判断するための演算子があります.それが==
です.その反対に,二つの値が等しくないかどうかを判断するためには!=
が使われます.上の例では3と7は等しくないため,aにはfalse,bにはtrueが代入されます.<
,>
,<=
,>=
はそれぞれ数学の<,>,≤,≥と同じ感じです.
また,プログラムの式の中に書く丸括弧は,数学で使うそれと同じように,丸括弧で囲ったところから計算してくださいという意味です.今回のはあってもなくても変わらないんですが,あった方が分かりやすいと思って入れました.ちなみにあっても無くても変わらないものと言えばスペースですね.厳密には然るべき場所には入れないといけませんし,変なところに入れてしまうとエラーになることもあります.例えば,intnum=3;
と書くとintnumなんて変数知りません!と怒られちゃいますし,i n t n u m = 3 ;
なんて書いちゃうとパソコンが勝手にシャットダウンしかねません(大嘘).しかし「キーワードの中にはスペースを入れない」,「キーワード同士はスペースで区切る」の二点を守ればどこにどれだけスペースを入れてもプログラムは動きます.ただし全角スペースだとエラーになるので気をつけてください.次回は条件分岐について説明します.