我有一个接口:ISearch< T>并且我有一个实现此接口的类:FileSearch:ISearch< FileSearchResult>
我有一个FileSearchArgs类:SearchArgs,它具有一种返回搜索对象的方法:
public override ISearch<SearchResult> getSearchObject ()
{
return ((ISearch<SearchResult>)new FileSearch());
}
这是从:
public virtual ISearch<SearchResult> getSearchObject () { return null; }
仅当我提供对(ISearch)的强制转换时,该代码才会生成,但在运行时会引发异常,并出现无法强制转换的错误.此外,先前的迭代没有将泛型应用于接口,因此getSearchObject()的方法签名如下:
public override ISearch getSearchObject() { return new FileSearch();}
我知道一种解决方案可能是返回基类“ Search”而不是接口的实现,但是我不希望这样做,并且理解为什么我不能遵循以前的模式.
任何帮助将不胜感激.我正在尝试简化操作,因此,如果需要任何说明,请告诉我!
提前致谢.
解决方法:
尝试这样声明您的接口:
interface ISearch<out T> {
// ...
}
(假设FileSearchResult继承自SearchResult,并且type参数仅出现在接口的协变位置中)
或者,如果您将始终使用SearchResults的子级:
interface ISearch<out T> where T : SearchResult {
// ...
}
更新:
现在,我知道您还在输入位置使用了type参数,您可以使用基本的非泛型接口:
interface ISearch { }
interface ISearch<T> : ISearch where T : SearchResult { }
// ...
public ISearch getSearchObject() {
return new FileSearch();
}
或segregate your interfaces (pdf)(如果这对您有意义):
interface ISearchCo<out T> where T : SearchResult {
T Result { get; }
}
interface ISearchContra<in T> where T : SearchResult {
T Result { set; }
}
// ...
public ISearchCo<SearchResult> getSearchObject() {
return (ISearchCo<SearchResult>)new FileSearch();
}