私は理解し、いくつかの問題を抱えています次のスニペットは、私にエラー一般的な制約が期待どおりに動作しません
public void SomeMethod<T>(T arg) where T : MyInterface
{
MyInterface e = arg;
}
しかし、私は一般的なのために働くことを期待する、このいずれかを、与えていない理由型制約
private readonly IList<Action<MyInterface>> myActionList = new List<Action<MyInterface>>();
public IDisposable Subscribe<T>(Action<T> callback) where T: MyInterface
{
myActionList.Add(callback); // doesn't compile
return null
}
は、私はVS2012 SP1と.NET 4.5を使用しています。このエラーに
cannot convert from 'System.Action<T>' to 'System.Action<MyInterface>'
を与えます。
誰かが制約によってこれをコンパイルできない理由を説明できますか?
なぜあなたのリストは読み込み専用ですか、なぜ新しいIListですか?それは実際の宣言ですか? –
クラスとデリゲートは同じではありません。 'System.Action'は 'MyInterface '型の単一パラメータを持つ関数を表し、' System.Action 'は' T:MyInterface'型のパラメータを持つメソッドを表します。関数のシグネチャは互換性がなく、 'T'が' MyInterface'の派生ではないということはなく、 'T'が正確に' MyInterface'だった場合にのみ署名が互換性があります。 –
@PaoloTedesco申し訳ありません、それは再構築され、他のコードから簡素化されています。コピー/貼り付けのエラー –