Tag: covariance

可以/应该将任务包装在C#5.0中,等待TResult中的协变吗?

我非常喜欢使用C#5.0异步编程。 但是,有些地方更新旧代码以与TAP模型保持一致会给我带来问题。 这是其中之一 – 我不确定为什么Task在TResult中不协变,但在尝试更新协变接口以从同步模式转换为异步模式时,它会给我带来问题: 旧代码: public interface IInitializable // ** out generic modifier ** { /// /// Boolean to indicate if class is ready /// bool IsInitialized { get; } /// /// Calls for instance to be initialized using current parameters /// Driver initialization can be done in the default constructor if desired /// […]

C#中的接口inheritance

我正试图在写我的应用程序时遇到的问题(我)问题。 请看这个(我会尽量缩短代码): 我有一个名为IRepository根接口。 接下来, IBookRepository : IRepository接下来,实现它的具体类: BookRepository : IBookRepository 在RepositoryManager类中,我声明了private IRepository currentRepo; IRepoItem是由Book类实现的接口。 现在,当我尝试做这样的事情时: currentRepo = new BookRepository(); VisualStudio提供错误消息: 无法将类型’BookRepository’隐式转换为’IRepository’。 存在显式转换(您是否错过了演员?) 我尝试显式转换,但抛出了运行时exception…… 我知道(几乎可以肯定)它是一种叫做协方差的东西,这可能(可能)在.Net 4.0中解决了。 不幸的是我正在使用框架版本3.5编写,我无法改变它。 请给我一些建议 – 如何超支这个问题? 我想从RepoFactory获得currentRepo,它会产生几种存储库,具体取决于用户的需求。 我不知道这里是否允许链接,但是我在http://olgatherer.wordpress.com/上写了一些博客,我描述了应用程序创建。 我的英语不好,但我希望能理解我。 提前谢谢你的回答。 最好的问候,skrzeczowas

不应该ILookup 在TElement中被(声明)协变?

System.Linq.ILookUp定义读取 interface ILookup : IEnumerable<IGrouping>, IEnumerable { int Count { get; } IEnumerable this[TKey key] { get; } bool Contains(TKey key); } 由于IEnumerable在IGrouping 中是协变的,因此IGrouping 在TElement中是协变的,并且接口仅将TElement作为返回类型公开,我认为ILookup在TElement中也是协变的。 的确,定义 interface IMyLookup : IEnumerable<IGrouping>, IEnumerable { int Count { get; } IEnumerable this[TKey key] { get; } bool Contains(TKey key); } 编译没有问题。 那么,原始定义中缺少out关键字的原因可能是什么? 可能会添加Linq的未来版本吗?

为什么我需要协方差接口(输出类型)?

我只需要再次使用covariant outgenerics修饰符。 我有一个generics类的类,想要添加一个但是VS告诉我这只能在接口上实现。 但为什么我只能在界面上使用out修饰符呢? 我帮助自己创建了我的类的接口副本,但这对我来说似乎有点奇怪,只有一个接口,所以我可以使用这个修饰符。

从Func 到Func 的转换工作但到Func 失败

我有以下代码: static Func s_objToString = (x) => x.ToString(); static Func s_stringToString = s_objToString; //compiles static Func s_intToString = s_objToString; //error 第二行编译,但第三行无法编译错误: 无法将类型’ System.Func ‘隐式转换为’ System.Func ‘ 这是为什么? 我理解,虽然字符串是从对象派生的,但是List并不是从List派生的,但是这里object是string工作而object是int失败,为什么呢? 好吧,让我说我理解为什么; 现在的问题是有一种解决方法(其他然后定义MyInt类到框int因为Func到Func工作)?

如何转换为ObservableCollection

我怎么能投 from ObservableCollection into ObservableCollection 这不适合我 (ObservableCollection)myTabItemObservableCollection

通用约束忽略协方差

假设我们有一个类似的界面 public interface IEnumerable { /*…*/ } 这是T 共变体 。 然后我们有另一个接口和一个实现它的类: public interface ISomeInterface {} public class SomeClass : ISomeInterface {} 现在,协方差允许我们执行以下操作 IEnumerable e = Enumerable.Empty(); 因此, IEnumerable 可分配给IEnumerable类型的变量(或方法参数)。 但是如果我们在通用方法中尝试这个: public void GenericMethod(IEnumerable p) where T : ISomeInterface { IEnumerable e = p; // or TestMethod(p); } public void TestMethod(IEnumerable x) {} 我们得到编译器错误CS0266告诉我们IEnumerable无法转换为IEnumerable 。 约束清楚地表明T是从ISomeInterface派生的,并且由于IEnumerable在T是共变量,因此该赋值应该起作用(如上所示)。 […]

使字典只能在C#中读取

我有一个Dictionary<string, List>并希望将该成员公开为只读。 我看到我可以将它作为IReadOnlyDictionary<string, List> ,但我无法弄清楚如何将其作为IReadOnlyDictionary<string, IReadOnlyList> 。 有没有办法做到这一点? 在c ++中,我只是使用const,但C#没有。 请注意,在这种情况下,简单地使用IReadOnlyDictionary没有帮助,因为我希望只读取值。 看来唯一的方法是构建另一个IReadOnlyDictionary,并向它们添加IReadOnlyList。 另一个我不会兴奋的选择是创建实现接口IReadOnlyDictionary>的包装器,并让它保存原始实例的副本,但这似乎有点过分。

C#返回类型协方差和Liskov替换原理

我正在尝试理解协方差和LSP。 从这个问题我可以看出C#不支持返回类型协方差。 然而Liskov替换原则对返回类型强加协方差。 这是否意味着在C#中应用这个原则是不可能的? 还是我想念一些东西?

为什么我不能从List 转换为List ?

我有一个对象列表,它是我的类型QuoteHeader ,我想将此列表作为对象列表传递给一个能够接受List 。 我的代码行读了…… Tools.MyMethod((List)MyListOfQuoteHeaders); 但是我在设计时遇到以下错误…… Cannot convert type ‘System.Collections.Generic.List’ to ‘System.Collections.Generic.List’ 我是否需要对我的class级做任何事情才允许这样做? 我以为所有类都inheritance自对象,所以我无法理解为什么这不起作用?