Bir değer türü için bir arabirim uygular ve bunu bir arabirim türünün bir Listesi'ne göndermeyi denerim, bu durum bir hatayla sonuçlanırken, referans türü yalnızca iyi sonuçlanır? Ben açık bir şekilde neden dönüştürmek için Cast<T>
yöntemi kullanmak zorundaToList <Interface> neden değer türleri için çalışmıyor?
Cannot convert instance argument type
System.Collections.Generic.List<MyValueType>
toSystem.Collections.Generic.IEnumerable<MyInterfaceType>
:
Bu
hatadır?IEnumerable
bir koleksiyon aracılığıyla yapılan bir sayım sayımı olduğundan, doğrudan alınamayacağımı anlamıyorum.
Burada sorunu göstermek için örnek kod verilmiştir:
public interface I{}
public class T : I{}
public struct V: I{}
public void test()
{
var listT = new List<T>();
var listV = new List<V>();
var listIT = listT.ToList<I>(); //OK
var listIV = listV.ToList<I>(); //FAILS to compile, why?
var listIV2 = listV.Cast<I>().ToList(); //OK
}
Varyans yapıları için çalışmaz. Varyans referans türleri için çalışır, çünkü temsiller (referanslar/işaretçiler) bit kalıplarını korurlar. –
@TheodorosChatzigiannakis contravariance olmalıdır, varyansı değil: http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29 – Fals
@Fals: Ne tür bir varyans değer türleri için çalışır. – SLaks