以下程序無法編譯,因爲在出現錯誤的行中,編譯器選擇使用單個參數T
作爲分辨率的方法,該參數由於List<T>
不符合通用約束條件單個T
。編譯器不承認有另一種方法可以使用。如果我刪除單一的方法,編譯器將正確地找到許多對象的方法。通用擴展方法解析失敗
我讀過兩篇關於通用方法分辨率的博客文章,一篇來自JonSkeet here,另一篇來自Eric Lippert here,但我找不到解釋或解決我的問題的方法。
很明顯,有兩種不同名稱的方法可以工作,但我喜歡這種情況下你有一個單一的方法。
namespace Test
{
using System.Collections.Generic;
public interface SomeInterface { }
public class SomeImplementation : SomeInterface { }
public static class ExtensionMethods
{
// comment out this line, to make the compiler chose the right method on the line that throws an error below
public static void Method<T>(this T parameter) where T : SomeInterface { }
public static void Method<T>(this IEnumerable<T> parameter) where T : SomeInterface { }
}
class Program
{
static void Main()
{
var instance = new SomeImplementation();
var instances = new List<SomeImplementation>();
// works
instance.Method();
// Error 1 The type 'System.Collections.Generic.List<Test.SomeImplementation>'
// cannot be used as type parameter 'T' in the generic type or method
// 'Test.ExtensionMethods.Method<T>(T)'. There is no implicit reference conversion
// from 'System.Collections.Generic.List<Test.SomeImplementation>' to 'Test.SomeInterface'.
instances.Method();
// works
(instances as IEnumerable<SomeImplementation>).Method();
}
}
}
您是否嘗試過'instances.Method();'? –
Dmitry
@Dmitry,確實會工作。我會測試一些東西。 – nvoigt