问题标签 [covariance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
176 浏览

c# - LINQ to SQL Covariance - 这是正确的方法吗?

我有几个数据库——大象、长颈鹿、大猩猩等——每个数据库都有一个输入和结果表,分别命名为 ElephantInputs、ElephantResults、GiraffeInputs、GiraffeResults、GorillaInputs、GorillaResults。我无法控制表命名。

我正在使用 LINQ to SQL 自动生成 ElephantInputs、ElephantResults、GiraffeInputs、GiraffeResults 等类。

我想编写一个类,Processor(),它可以从任何这些数据库中读取输入并对其进行处理。我有一个工厂方法,它根据用户的选择实例化一个处理器。

我做的第一件事是为 Input 和 Result 对象创建一个接口,并为每个数据库创建一个分部类,以便其输入和结果对象实现该接口。这给了我每个动物的通用界面。我还为每个数据库创建了一个存储库类,它具有一些从数据库返回项目的方法。

接下来,我为我的处理器创建了一个接口

这是一个具体的处理器,以及创建它的工厂。

最后,这是调用处理器的程序:

我这样做对吗?有没有更简单的方法?谢谢

0 投票
6 回答
9143 浏览

.net - 字典在 .NET 4 中不是协变的

.NET 4 / Silverlight 4 中的IDictionary<TKey, TValue>不支持协方差,即我不能做

类似于我IEnumerable<T>现在可以用 s 做的事情。

可能归结为KeyValuePair<TKey, TValue>也不是协变的。我觉得至少在值的字典中应该允许协方差。

那么这是一个错误还是一个功能?它会不会出现,也许在 .NET 37.4 中?

更新(2年后):

.NET 4.5 中会有一个IReadOnlyDictionary<TKey, TValue>,但它也不会是协变的:·/,因为它派生自IEnumerable<KeyValuePair<TKey, TValue>>,并且KeyValuePair<TKey, TValue>不是接口,因此不能是协变的。

BCL 团队将不得不重新设计很多东西来ICovariantPair<TKey, TValue>替代使用。强类型索引器this[TKey key]也不能用于协变接口。类似的结果只能通过在GetValue<>(this IReadOnlyDictionary<TKey, TValue> self, TKey key)某个地方放置一个扩展方法来实现,该方法在内部必须以某种方式调用一个实际的实现,可以说这看起来是一种非常混乱的方法。

0 投票
3 回答
12042 浏览

c# - 更快的方法来投射 Func功能?

有没有更快的投射Fun<TEntity, TId>方式Func<TEntity, object>

有没有办法像上面的例子一样在返回的 lambda 中没有反射代码的情况下转换typedGetPropertyFn为 a ?Func<TEntity, object>

编辑:添加修改后的解决方案

好的,感谢 280Z28 引导我走上正确的道路,我已将其包含在下面的最终解决方案中。对于不支持表达式的平台,我已经将反射代码留在了那里。对于这样做的平台,它显示获取和属性的性能提高了26 倍27 倍(13 / .5 刻度平均)。intstring

0 投票
6 回答
33447 浏览

c# - 协方差和反方差之间的区别

我无法理解协方差和逆变之间的区别。

0 投票
3 回答
11726 浏览

java - java中的泛型函数是如何实现的?

根据我的理解,java中的以下通用函数:

编译为以下形式(因为它是无界的):

但是,当我运行以下语句时,编译器能够确定返回值是整数类型。编译器是如何计算出来的?

为了使上述语句起作用,该函数不应该写成如下吗?

0 投票
1 回答
203 浏览

c# - C#协方差问题

我有一个 linq-to-sql 生成的域实体,我将其转换为正确的接口,如下所示:

但是,我重命名了 linq-to-sql 表,而没有触及我的部分类,并且代码仍然编译。

该列表有适量的元素,但它们都是空的。

我是否需要编写一个辅助方法来确保它可以工作,或者在.net 3.5 中是否有一种编译时安全的简单内置方法可以做到这一点?

0 投票
3 回答
3313 浏览

.net-4.0 - C# 4.0 中的泛型变体

C# 4.0 中的 Generic Variance 的实现方式使得可以毫无例外地编写以下内容(这在 C# 3.0 中会发生):

[示例非功能性:参见 Jon Skeet 的回答]

我最近参加了一个会议,Jon Skeet 对通用方差进行了出色的概述,但我不确定我是否完全理解它 - 我理解inout关键字在反方差和协方差方面的重要性,但我很好奇幕后发生的事情。

执行此代码时,CLR 会看到什么?它是隐式转换List<int>List<object>还是简单地内置,我们现在可以在派生类型之间转换为父类型?

出于兴趣,为什么在以前的版本中没有引入它,主要的好处是什么 - 即现实世界的使用?

有关通用差异的这篇文章的更多信息(但问题非常过时,正在寻找真实的最新信息)

0 投票
4 回答
1749 浏览

c# - .NET 4.0 中的协变和逆变错误

C# 4.0 协变和逆变支持的一些奇怪行为:

结果是ArgumentException: Delegates must be of the same type.

奇怪,不是吗?为什么Delegate.Combine()(在对委托执行+=操作时调用)在运行时不支持协变和逆变?

此外,我发现 BCL 的委托类型在其泛型参数System.EventHandler<TEventArgs>上没有逆变注释!TEventArgs为什么?这是完全合法的,TEventArgs仅在输入位置使用的类型。也许没有逆变注释,因为它很好地隐藏了带有Delegate.Combine()? ;)

ps 所有这些都会影响到VS2010 RC 及更高版本。

0 投票
1 回答
365 浏览

c# - 协变、逆变和委托问题

我再次需要你的帮助,这一次我在协变、逆变、委托和一个简单的想法爆炸中挣扎......

我想为我们的 businessobject-properties 实现一个属性,该属性接受一个委托和该委托所需的参数,以便我可以使用反射、读出属性并对属性值执行验证。

这背后的原因是,我们正在使用带有 DataBinding 的 Windows.Forms,并且需要将 DataBinding 更新方法设置为 OnPropertyChanged,以在 GUI 上获得正常工作的刷新。然而,我们确实需要一种在控件的验证事件中做出反应以正确验证属性的方法,以查看用户是否可以实际保存对象。但是控件的 Validating-Event 仅在将值写入属性后才会发生。在属性的设置器中进行验证会导致崩溃,并且我们无法向用户提供确切的信息,除非我们第二次实施验证(或将其提取到从设置器调用的方法中)。

为了保持这个最优雅和干净,我认为拥有以下之一会很不错:

这样我就可以通过反射对所有属性进行迭代,执行我们希望它们执行的所有验证,并使用正确的方法设置 PropertyValidator-Attribute。但是我对这个想法进行了一些尝试,但无论如何都没有让它发挥作用,这就是我所拥有的,可能你对如何实现这一点有一个想法。

欢迎任何提示...

0 投票
6 回答
1217 浏览

c# - 委托协方差混淆难题!

为什么这不起作用?我没有正确理解委托协方差吗?