我有一些無法理解爲什麼下面的代碼片段並沒有給我一個錯誤行動泛型約束不能按預期工作
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
}
給出了這樣的錯誤
cannot convert from 'System.Action<T>' to 'System.Action<MyInterface>'
我使用VS2012 SP1和.NET 4.5。
任何人都可以解釋爲什麼約束不允許這樣編譯?
爲什麼您的列表只讀,爲什麼'新的IList'?這是實際的宣言嗎? – 2013-03-25 09:03:29
班級和代表不是一回事。 'System.Action'代表具有'MyInterface'類型的單個參數的函數,而'System.Action '代表具有'T:MyInterface'類型參數的方法。函數簽名是不兼容的,'T'是'MyInterface'的衍生物並不相關,只有'T'完全是'MyInterface'時,簽名纔會兼容。 –
2013-03-25 09:04:13
@PaoloTedesco道歉,它從一些其他代碼重建和簡化。複製/粘貼錯誤 – 2013-03-25 09:18:27