1. 概要
ここでは、わたしが遭遇した、「Visual Studio 2022」での警告について、内容や対処方法について、記述します。
ここでの対処方法は、あくまでも応急処置的なものなので、実際に有効となる対処方法は、プログラムの全体を見る必要があります。
2. BC40056
下記のようなメッセージが表示されます。
インポート 'someLib' で指定された名前空間または型が、パブリック メンバーを含んでいないか、あるいは見つかりません。名前空間または型が定義されていて、少なくとも 1 つのパブリック メンバーを含んでいることを確認してください。また、インポートされた要素名がエイリアスを使用していないことを確認してください。
これは、インポートしているものが見当たらなかったときに出力されるもののようです。
Imports someLib
わたしの環境の場合、これは、必要ないものだったようで、行ごと削除したら、解消しました。
3. BC40057
下記のようなメッセージが表示されます。
プロジェクト レベルのインポート 'someLib' で指定された名前空間または型が、パブリック メンバーを含んでいないか、または見つかりません。名前空間または型が定義されていて、少なくとも 1 つのパブリック メンバーを含んでいることを確認してください。また、インポートされた要素名にエイリアスが使用されていないことを確認してください。
前項と同様の状況で発生しているように見えるのですが、対象となる行が判然としません。
参考サイトには、下記のような対応が記述されています。
・プロジェクト デザイナーを開き、[参照] ページに切り替えます。
・[ インポートされた名前空間 ] セクションで、含まれている要素にプロジェクトからアクセス可能であることを確認します。
・含まれている要素が少なくとも 1 つの Public メンバーを公開していることを確認します。
現在(2025年10月17日)、上記のやり方が、よくわかっていません。
4. CS0108
下記のようなメッセージが表示されます。
'somePointList.Add(somePoint)' は継承されたメンバー 'List<somePoint>.Add(somePoint)' を非表示にします。非表示にする場合は、キーワード new を使用してください。
ひとつのケースとして下記のようなケースがあります。
public class BaseClass
{
public int i = 1;
}
public class DerivedClass : BaseClass
{
public static int i = 2;
public static void Main()
{
Console.WriteLine(i);
}
}
基底クラスと、派生クラスで、同じメンバ変数を扱っているかららしい。
派生クラスの代入文の箇所で表示されます。
これは、下記のように記述することで解消します。
public static new int i = 2;
もうひとつ、下記のようなケースがあります。
public class someClass2Base
{
public int point { get; set; }
public void Add(int crossPoint)
{
point = crossPoint;
}
}
public class someClass2 : someClass2Base
{
public void Add(int crossPoint)
{
base.Add(crossPoint);
}
}
これは、基底クラスと派生クラスで、同じ名前のメソッドがあるために発生するらしい。
これは、例えば、派生クラスのメソッドの定義に「new」を加えることで、解消します。
public class someClass2 : someClass2Base
{
public new void Add(int crossPoint)
{
base.Add(crossPoint);
}
}
5. CS0169
下記のようなメッセージが表示されます。
フィールド 'Class.i' は使用されていません
下記のようなクラスで、発生します。
public class Class
{
private int i;
private int j;
public Class()
{
this.j = 1;
}
}
この場合、ほんとに使用していないメンバ変数がありますので、不要であれば、削除します。
6. CS0219
下記のようなメッセージが表示されます。
変数 'a' は割り当てられていますが、その値は使用されていません
下記のような、構文で発生します。
foreach (int i in intList)
{
int a = 1;
}
まあ、例題は極端な例で、実際、変数に値を割り当てているものの、使っていないわけで。
本当に使う必要がなければ、代入文の行ごと削除しちゃいます。
7. CS0628
下記のようなメッセージが表示されます。
'Class6.Class6()': 新規の protected メンバーが sealed 型で宣言されました
この警告は、「sealed」 (シール) クラス内で「protected」(プロテクト) アクセス修飾子を持つメンバー(フィールド、メソッド、プロパティなど)を宣言した場合に発生します。
・protected メンバー
このメンバーは、そのクラス自身と、そのクラスを継承する派生クラスからのみアクセスできます。
・sealed クラス
このクラスは、他のクラスから継承することを禁止されています。
継承できないクラスで「protected」メンバーを宣言しても、そのメンバーにアクセスできる派生クラスが存在しないため、意味がありません。
コンパイラはこれを警告として通知します。
下記のような構文で、発生します。
public sealed class Class6
{
protected Class6() { }
}
以下のいずれかの対応を行います。
・メンバーのアクセス修飾子を変更する
そのメンバーがクラス内部でのみ使用される場合は、アクセス修飾子を「private」に変更します。
他のアセンブリからアクセスする必要がある場合は、「public」または「internal」を検討します。
・クラスの sealed 修飾子を削除する
将来的にそのクラスを継承する可能性がある場合は、クラス宣言から「sealed」キーワードを削除し、継承可能なクラスにします。
8. IDE0017
下記のようなメッセージが表示されます。
オブジェクトの初期化を簡素化できます
下記のような構文で発生します。
var person = new Person();
person.FirstName = "John";
person.LastName = "Doe";
初期化は、下記のように書けば、簡略化できるという。
var person = new Person{ FirstName = "John", LastName = "Doe" };
この場合、警告というよりは、提案ですかな?
9. IDE0019
下記のようなメッセージが表示されます。
パターン マッチングを使用します
下記のような構文で発生します。
Button? senderbtn = sender as Button;
if (senderbtn != null)
{
return;
}
下記のように修正します。
if (sender is Button senderbtn)
{
return;
}
10. IDE0028
下記のようなメッセージが表示されます。
コレクションの初期化を簡素化できます
下記のような構文で発生します。
List intList = new List();
Dictionary freqDict = new Dictionary();
下記のように修正します。
List intList = [];
Dictionary freqDict = [];
あるいは、下記のようなクラスを。
public struct ObjectId
{
internal long id;
}
public class NameListItem
{
public string Name { get; set; }
public ObjectId ObjectID { get; set; }
public NameListItem(string oname, ObjectId oid)
{
Name = oname;
ObjectID = oid;
}
}
public class NameList : List<NameListItem>
{
public void Add(string name, ObjectId oid)
{
try
{
base.Add(new NameListItem(name, oid));
}
catch (System.Exception)
{
throw;
}
}
}
宣言するときも。
NameList someList = new NameList();
同じ表示になりますので、下記のように宣言します。
NameList someList = [];
11. IDE0044
下記のようなメッセージが表示されます。
フィールドを読み取り専用にします
下記のような構文で発生します。
private int id;
変数に対して、代入が発生しない場合に表示されます。
「readonly」修飾子をフィールド宣言に追加します。
private readonly int id;
12. MSB3270
下記のようなメッセージが表示されます。
構築されているプロジェクトのプロセッサ アーキテクチャ "MSIL" と、参照 "accoremgd" のプロセッサ アーキテクチャ "AMD64" の間には不一致がありました。この不一致は、ランタイム エラーを発生させる可能性があります。プロジェクトと参照の間でプロセッサ アーキテクチャが一致するように、構成マネージャーを使用してターゲットとするプロジェクトのプロセッサ アーキテクチャを変更するか、ターゲットとするプロジェクトのプロセッサ アーキテクチャに一致するプロセッサ アーキテクチャとの依存関係を参照で設定することを検討してください。
参考サイトによれば、「MSB3270警告の主な原因は、プロジェクトが参照しているアセンブリが、ターゲットプラットフォームと互換性がないことです」ちゅうことだそうで。
「具体的には以下のような状況が考えられます」と、下記のような例をあげています。
アセンブリのビット数の不一致:
・プロジェクトが32ビット(x86)として設定されているのに対し、参照しているアセンブリが64ビット(x64)用である場合、またはその逆の場合に警告が発生します。
異なる.NET Frameworkバージョン:
・.NET Frameworkのバージョンと、参照アセンブリのターゲットバージョンが一致していない場合。
CPUアーキテクチャの不一致:
・ vs x86/x64)を対象としている場合。
わたしが、出くわしたものは、現在対処方法がわかっていません。 追而書
13. MSB3277
下記のようなメッセージが表示されます。
"Microsoft.VisualBasic" の異なるバージョン間で、解決できない競合が見つかりました。
"Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" と "Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" の間で競合が発生しました。
プライマリであるため、"Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" が選択されました。"Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" はプライマリではありませんでした。
"Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\8.0.20\ref\net8.0\Microsoft.VisualBasic.dll] に依存する参照です。
C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\8.0.20\ref\net8.0\Microsoft.VisualBasic.dll
参照 "C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\8.0.20\ref\net8.0\Microsoft.VisualBasic.dll" の原因となったプロジェクト ファイルの項目インクルード。
C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\8.0.20\ref/net8.0/Microsoft.VisualBasic.dll
実際は、この下に、参照しているライブラリがずっと羅列されます。
依存している、ライブラリと、「Visual Studio 2022」で使用している、「Visual Basic」のバージョンが異なるために、発生しているようです。
これも、今んとこ、解決方法が見当たらないので、追而書
14. 参考サイト
本ページは、下記のサイトおよび「Google」大先生を参考にさせていただきました。
「C# OleDb CA1416 の警告をクリアする (visual studio) 」
「VisualStudio プロジェクトビルド時に出る MSB3270 警告の対処法」
「プロジェクト レベルのインポート '' で指定された名前空間または型にパブリック メンバーが含まれていないか ...」
「CA1854: 'IDictionary.TryGetValue(TKey, out TValue)' メソッドを優先する」