Komple uzatma yöntemi alıcı gibi soru kabul değildir:Neden (T) IEnumerable kodundan önce
Neden IEnumerable<T>
where T : ITest
this IEnumerable<ITest>
beklediği bir uzantısı yönteminin alıcı olarak kabul edilmez?
Ve şimdi kod:
Ben üç tip var:
public interface ITest { }
public class Element : ITest { }
public class ElementInfo : ITest { }
Ve iki uzatma yöntemleri:
public static class Extensions
{
public static IEnumerable<ElementInfo> Method<T>(
this IEnumerable<T> collection)
where T : ITest
{
→ return collection.ToInfoObjects();
}
public static IEnumerable<ElementInfo> ToInfoObjects(
this IEnumerable<ITest> collection)
{
return collection.Select(item => new ElementInfo());
}
}
(işaretli satırda) alıyorum derleyici hatası :
CS1929
:'IEnumerable<T>'
'ToInfoObjects'
için bir tanım ve en uzantısı yöntemi aşırı'Extensions.ToInfoObjects(IEnumerable<ITest>)'
içermez neden bu kadar olan tipte'IEnumerable<ITest>'
bir alıcısı gerektirir? ToInfoObjects
uzantı yönteminin alıcısı bir IEnumerable<T>
ve jenerik tip kısıtlaması ile T
ITest
'u uygulamalıdır.
Neden alıcı kabul edilmiyor? Benim tahminim IEnumerable<T>
'un kovaryansıdır ama emin değilim.
'u IEnumerable<T> where T : ITest
almak için değiştirirseniz, her şey yolundadır.
Gerçekten iyi bir cevap. Saygı. – Vasilievski
Şimdi bunu söyledin, benim için açık görünüyor. T değeri olabilirdi ve tabii ki işe yaramazdı. Çok teşekkür ederim. Bir takip olarak, [nedenine bağlantı] yapmak istiyorum (http://stackoverflow.com/questions/12454794/why-covariance-and-contravariance-do-not-support-value-type) neden co (ntra)) Varyans, değer tipleri ile çalışmaz. –