aşağıdaki kod parçacığı kovaryant değil neden olarak anlamış değilim?C# dışı genel tür parametreleri neden kovaryansı ihlal ediyor?
public interface IResourceColl<out T> : IEnumerable<T> where T : IResource {
int Count { get; }
T this[int index] { get; }
bool TryGetValue(string SUID, out T obj); // Error here?
}
Hata 1 Geçersiz varyans: tür parametresi 'T 'IResourceColl.TryGetValue (T üzerinden dizesi)' üzerine değişmez geçerli olması gerekir. 'T', kovaryantıdır.
Benim arayüzü yalnızca çıkış pozisyonlarda şablon parametresini kullanır. Kolayca
public interface IResourceColl<out T> : IEnumerable<T> where T : class, IResource {
int Count { get; }
T this[int index] { get; }
T TryGetValue(string SUID); // return null if not found
}
gibi bir şey bu kodu refactor olabilir ama benim asıl kod aslında kovaryansını ihlal ederse anlamaya çalışıyorum ya bu kovaryans bir derleyici veya .NET sınırlama ise.
olası yinelenen [C#: destek polimorfizmi 'dışarı' değil neden 'ref' ve] (http: // stackoverflow. com/questions/1207144/c-sharp-why-does-ref-ve-out-destek-polimorfizm) – Jon
Burada dikkat edilmesi gereken önemli nokta şudur: ['out'] (http://msdn.microsoft.com/en -us/library/ee332485.aspx) (parametre değiştirici) ['out'] ile tamamen ilgisi yoktur (http://msdn.microsoft.com/en-us/library/dd469487.aspx) (jenerik türde kullanılır) parametre). – Jon
@Jon - bu soru C# 3.0 ve öncesi için geçerlidir. Burada açıklanan sözdizimi C# 4.0 – Oded