【发布时间】:2014-03-16 23:31:04
【问题描述】:
我在尝试将一个实例转换为另一种实例类型时遇到问题。我认为,通过继承,这应该可以工作。
这是错误消息。 (抱歉阅读困难 - 在新标签页中打开)
这是上下文。
public interface IItem { ... }
public class AuctionItem : IItem { ... }
public class BuyNowItem : IItem { ... }
public class SearchResult<T> where T : IItem
{
public IList<T> Items { get; set; }
public int TotalCount { get; set; }
}
所以我们有 2 个具体的类,它们都实现了IItem 接口和一个包含IItems 列表的结果类。
现在,我们如何使用它?我们定义一个搜索界面...
public interface ISearchService<T, in TU>
where T : IItem
where TU : ISearchOptions
{
string Name { get; }
Task<SearchResult<T>> SearchAsync(TU searchOptions);
}
所以在这里我们可以看到我们可以搜索一些东西(例如 eBay),它会返回一些结果(例如 IItems)。
我该如何实现呢?现在,我有一个疯狂的方法,看起来像这样......
public class FooSearchService<T, TU> : ISearchService<T, TU>
where T : AuctionItem, new()
where TU : AuctionSearchOptions
{
public async Task<SearchResult<T>> SearchAsync(TU searchOptions) { .. }
}
目前看来一切正常......
直到我现在尝试这个......
<my console app .. and yes, i'm not awaiting this call, etc...>
private SearchResult<IItem> DoSearches(Notification notification)
{
if (ebay)
{
var searchResult = _ebaySearchService.SearchAsync(auctionSearchOptions);
return searchResult.Result; // ** COMPILE ERROR HERE
}
else if (somethingElse_eg_BuyNow_1)
{
...
return buyNowSearchResult.Result;
}
}
看看我在做什么?我想说:搜索 ebay 并返回 AuctionItem 搜索结果。或者尝试其他服务并返回他们的BuyNowItem's ...
我想,因为 ebay 返回一个SearchResult<AuctionItem>,所以调用方法想要返回一个SearchResut<IItem>,这是AuctionItem 实现的,所以我认为它会没问题。但这不是:(
谁能提供帮助?
更新
现在几乎可以正常工作了 :) @jdphenix 的回答基本上使它正常工作。唯一的问题是我正在尝试返回 Task<..> 但这不起作用。这是错误消息..
【问题讨论】:
-
不要太仔细地猜测你的问题:看看Covariance and Contravariance in Generics。
-
要添加到@poke 的指针,请尝试
ISearchService<out T, in TU>和FooSearchService<out T, in TU>。 -
@Noseratio 只有接口可以用协变和逆变来声明。
-
@Lukazoid,正确,我忽略了
FooSearchService<out T, in TU>不是接口。所以需要做一个接口IFooSearchService<out T, in TU>,然后FooSearchService应该派生出来。 -
我总是忘记 DNF.net !很棒的伙伴:)会做的!
标签: c# .net covariance contravariance