Aşağıdaki C # kodunun neden derlenmediğini anlayamıyorum.
Gördüğünüz gibi, statik bir jenerik yöntemim var Bir IEnumerable<T>
parametreye sahip bir şey (ve T
bir IA
arabirim olarak sınırlandırılmıştır ) ve bu parametre örtük olarak IEnumerable<IA>
.
Açıklaması nedir? (Neden işe yaramadığını anlamak için bir çözüm aramıyorum).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Sıraya girdiğimde hata Something2(bar)
:
Bağımsız Değişken 1: 'System.Collections.Generic.List'den' System.Collections.Generic.IEnumerable'a dönüştürülemiyor
T
Referans türleriyle sınırlandırmadınız . Koşulu kullanırsanız, where T: class, IA
o zaman işe yaramalıdır. Bağlantılı yanıtta daha fazla ayrıntı var.
Something2(foo);
Doğrudan söyleyerek de durumu yeniden oluşturabilirsiniz . Bunu anlamak .ToList()
için bir List<T>
( T
genel yöntem tarafından bildirilen tür parametrenizdir) almak için dolaşmak gerekli değildir (a List<T>
bir an'dır IEnumerable<T>
).