kullanımından çıkarılamıyor. Bazı jenerik ve miras sorunları yaşıyorum. İşi T
öğesinin herhangi bir alt sınıfta tanımlanan ölçütlerle eşleşip eşleşmediğini belirlemek olan CriteriaBase
adlı bir özet sınıfım var. Alt-sınıflar, kriterleri temsil eden bir Func
döndüren bir metodu uygulamak zorundadır. Sorun, Func
için jenerik kullanmayı denediğimde ortaya çıkar. Umarım bazı kodlar benim sorunumu gösterir.'Tür argümanları'
public abstract class CriteriaBase<T, U>
where T : ICrossoverable
where U : IChromosome
{
protected abstract Func<U, bool> Criteria { get; }
//some code removed for brevity
private int GetNumberOfCriteriaMatches(T season)
{
//1. works
//Func<IChromosome, bool> predicate = c => c.Genes == null;
//return season.Chromosomes.Count(predicate);
//2. doesn't work - The type arguments for method 'int
//System.Linq.Enumerable.Count<TSource>(this IEnumerable<TSource>,
//Func<TSource, bool>)'
//cannot be inferred from the usage. Try specifying the type arguments
//explicitly.
return season.Chromosomes.Count(Criteria);
}
}
Niyetim CriteriaBase
sınıf jenerik ve tamamen tekrar olması gerektiğidir.
bir örneği, bir alt-grubu:
public class TopTeamsPlayingEachOtherCriteria : CriteriaBase<Season, MatchDay>
{
//some code removed for brevity
protected override Func<MatchDay, bool> Criteria
{
get { return matchDay =>
matchDay.Fixtures.Count(
fixture =>
fixture.HomeTeam.TableGrouping.Ordering == 1
&& fixture.AwayTeam.TableGrouping.Ordering == 1) > 1; }
}
}
sorun GetNumberOfCriteriaMatches()
yöntemindedir. Seçenek 2, kodu ilk olarak yazdım ancak listelenen derleme hatasını alıyorum. Seçenek 1'i kullanırsam, kod derler ama alt sınıftaki Criteria
'u geçersiz kıldığımda, MatchDay
yerine IChromosome
kullanmak zorunda olduğum anlamına gelir (MatchDay
'un belirli özelliklerine erişmem gerekiyor). Basit aklımda, seçenekler 1 ve 2 eşdeğerdir. Seçenek 2, IChromosome
'un IChromosome
'u uygulayan bir sınıfla sınırlı olan genel tür U
ile değiştirir.
Mümkün olanı başarmaya çalışıyorum mı? Öyleyse, ne eksik/yanlış anlama var? Eğer değilse, bu probleme nasıl yaklaşmalıyım?
(Ben soruyla yardımcı ne kadar emin değilim olarak sonuna eklenmiştir) Bütünlüğü için, burada şu anda T
(Season
) ve U
(MatchDay
) için kullanıyorum iki kuruluştur.
public class Season : ICrossoverable
{
private readonly IEnumerable<MatchDay> _matchDays;
public Season(IEnumerable<MatchDay> matchDays)
{
_matchDays = matchDays;
}
public IEnumerable<MatchDay> MatchDays
{
get { return _matchDays; }
}
//ICrossoverable implementation
public IEnumerable<IChromosome> Chromosomes
{
get { return _matchDays; }
}
}
public class MatchDay : IChromosome
{
private readonly int _week;
private readonly List<Fixture> _fixtures;
public MatchDay(int week, List<Fixture> fixtures)
{
_week = week;
_fixtures = fixtures;
}
//some code removed for brevity
public IEnumerable<Fixture> Fixtures
{
get { return _fixtures; }
}
//IChromosome implementation
public IEnumerable<IGene> Genes
{
get { return Fixtures; }
}
}
Hangi sürüme sahiptir.net framework kullanıyor musunuz? –
.NET sürüm 4 - tam sürüm istemci profili değil. Cevap sürüme bağlı olarak değişiyor mu? İlginçse Visual Studio 2010'u kullanın. – Stu
Delegate covariance ve contravariance, sürüm 4.0 –