推斷我有泛型和繼承的麻煩。我有一個叫做CriteriaBase
的抽象類,它的任務是確定實體T
是否與任何子類中定義的標準相匹配。子類必須實現一個返回代表標準的Func
的方法。當我嘗試使用Func
的泛型時出現問題。希望有些代碼會說明我的問題。'類型參數不能從使用'
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);
}
}
我的意圖是,CriteriaBase
類應該是通用的,完全可重複使用。
一個例子的子類:
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; }
}
}
的問題是在GetNumberOfCriteriaMatches()
方法。選項2是我最初編寫代碼的方式,但是我列出了編譯錯誤。如果我使用選項1,則代碼會編譯,但這意味着當我在子類中覆蓋Criteria
時,必須使用IChromosome
而不是MatchDay
,這不起作用(我需要訪問MatchDay
的特定功能)。在我簡單的想法中,選項1和2是相同的。選項2只是將IChromosome
替換爲通用類型U
,該類型僅限於實現IChromosome
的類。
是我想要實現的可能嗎?如果是這樣,我錯過了什麼/誤解?如果不是,我該如何處理這個問題?
爲了完整(包括在最後,因爲我不知道它有多大幫助與問題),這裏是我目前使用的T
(Season
)和U
(MatchDay
)兩個實體。
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; }
}
}
什麼版本。你使用的網絡框架? – 2013-04-07 21:46:43
.NET版本4 - 完整版本不是客戶端配置文件。答案根據版本有所不同嗎?如果這很有趣,請使用Visual Studio 2010。 – Stu 2013-04-07 21:57:08
代表協變和反變換在C#中從4.0版開始工作 – 2013-04-08 04:54:40