我在看this問題,我很好奇爲什麼這deosn't編譯。擴展方法與泛型
鑑於此代碼,任何人都可以解釋爲什麼IBase.Test()
的調用不解析爲正確的擴展方法?
public interface IBase { }
public interface IChildA : IBase { }
public interface IChildB : IBase { }
public static class BaseExtensions
{
public static IBase Test(this IBase self) { return self; }
public static T Test<T>(this T self) where T : IChildB { return self; }
}
public static class TestClass
{
public static void Test()
{
IChildA a = null; //Yeh i know its null but just testing for compile here..
IBase firstTry = a.Test(); //Cannot resolve to BaseExtensions.Test(this IBase obj)
IBase secondTry = ((IBase)a).Test(); //Resolves to BaseExtensions.Test(this IBase obj)
IChildB b = null;
IChildB touchedB = b.Test();
}
}
我得到的錯誤是
Error 166 The type 'IChildA' cannot be used as type parameter 'T' in the generic type or method 'BaseExtensions.Test<T>(T)'. There is no implicit reference conversion from 'IChildA' to 'IChildB'.
我有一種感覺,那是因爲這將是ambigous對於任何實現IChildB
和不知道使用哪種擴展方法,但錯誤消息不會呻吟它的一面,如果你刪除IBase firstTry = a.Test();
線,那麼它編譯罰款..
您的編譯器錯誤與您發佈的代碼不符(Test vs Touch)。請發佈您發佈的*精確*代碼的*確切*錯誤 - 否則我們不會知道您可能做出的其他細微更改。 – 2011-03-23 09:55:07
道歉..固定 – 2011-03-23 09:56:37
另請參閱http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx大約一百人告訴我,我錯了,這是一個明智的規則。 – 2013-09-23 21:33:14