私はこの拡張メソッドを持っていました
public static List<Models.SomeObject> ToServiceModel(this List<SomeObject> source)
{
return source
.Select(s => s.ToServiceModel())
.ToList();
}
ここで、SomeObject はサードパーティ オブジェクトで、Models.SomeObject はそのサービス モデル バージョンであり、すべて正常に機能しました。
次に、この拡張メソッドを追加しました
public static List<UnrelatedObject> ToServiceModel(this List<Data.Models.UnrelatedObject> source)
{
return Mapper.Map<List<Data.Models.SqueezePage>, List<SqueezePage>>(source);
}
ここで、Data.Models.UnrelatedObject は Code First オブジェクトであり、UnrelatedObject はサービス モデルです。
しかし、入力するとnew List<UnrelatedObject>().ToServiceModel()
、拡張メソッドごとに 1 つずつ、Intellisense の 2 つのオプションが表示されます。コンパイラは、最初の型の参照を含める必要があるというエラーも発生します。これは、明らかに型が属していないという間違った原因です。
入力してもnew List<int>().ToServiceModel
、最初のオプション (および別の拡張メソッド) のオプションは表示されますが、2 番目のオプションは表示されません。
これは、共分散または反分散と関係がありますか? 拡張メソッドが対象の型でのみ有効になるように、この余分なインテリセンスとコンパイラの混乱をすべて止めるにはどうすればよいですか?
更新しました:
タイトルを変更したので、IntelliSense ではなくコンパイルの問題に再び焦点を当ててみます。
The type '{0}' is defined in an assembly that is not referenced. You must add a reference to assembly '{1}'.
プロジェクト A は、アセンブリ C を参照するプロジェクト B を参照します。プロジェクト A は、アセンブリ C で型を直接使用していないにもかかわらず、アセンブリ C への参照を要求しています。
上記の拡張メソッドを使用せずにすべてがコンパイルされることを確認しましたが、追加してビルドすると、アセンブリの問題が発生します。私は、拡張メソッドで使用されるモデルが Project D の型を使用し、Assembly C に接続されておらず、POCO であり、.NET 型のみを使用する型を使用していることを確認しました。
では、無関係な拡張メソッドをプロジェクト B に追加すると、プロジェクト A が不要な参照を突然必要とするのはなぜでしょうか?