Aşağıdaki program derlenmiyor, çünkü hatayla birlikte derleyici, yöntemi tek bir T
parametresiyle çözüm olarak seçiyor, çünkü bu hata List<T>
'un genel kısıtlamalarına uymadığından başarısız oluyor. tekli T
. Derleyici, kullanılabilecek başka bir yöntem olduğunu algılamaz. Tek T
yöntemini kaldırırsam, derleyici birçok nesne için yöntemi doğru olarak bulur.Genel uzantı yöntemi çözünürlüğü başarısız oluyor
Jenerik yöntem çözünürlüğü, JonSkeet here ve Eric Lippert here'dan başka iki blog yazısı okudum, ancak sorunumu çözmek için bir açıklama veya yol bulamadım.
Açıkçası, farklı isimlere sahip iki yöntemin olması işe yarayacaktı, ancak bu durumlar için tek bir yöntemin olması gerçeğini beğeniyorum. Dmitry önerildiği gibi ikincisi aşağıdaki şekilde arayarak,
public static void Method(this SomeInterface parameter) { /*...*/ }
Veya:
instances.Method<SomeImplementation>();
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 gerçekten işe yarayacak. Birkaç şeyi test edeceğim. – nvoigt