两者之间有什么区别
public interface IExample<out T>
{
...
}
vs.
public interface IExample<T>
{
...
}
考虑
class Fruit {}
class Banana : Fruit {}
interface ICovariantSkinned<out T> {}
interface ISkinned<T> {}
和功能,
void Peel(ISkinned<Fruit> skinned) { }
void Peel(ICovariantSkinned<Fruit> skinned) { }
接受ICoVariantSkined的函数
接受
ISkinned 的函数
为了方便地记住in
和out
关键字(也是协方差和逆差)的用法,我们可以将继承映像为包装:
String : Object
Bar : Foo
泛型中的 out
关键字用于表示接口中的类型 T 是协变的。有关详细信息,请参阅协方差和逆方差。
经典的例子是 IEnumerable
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;
如果这不是协变的,上面的第二行将会失败,尽管从逻辑上讲它应该可以工作,因为string是从object派生的。在通用接口的差异被添加到C#和VB.NET之前(在。NET 4和VS 2010),这是一个编译时错误。
之后。NET 4,<代码>IEnumable
这不适用于像
IList这样的类型
IList<string> strings = new List<string>();
IList<object> objects = strings; // NOTE: Fails at compile time
然后你可以打电话:
objects.Add(new Image()); // This should work, since IList<object> should let us add **any** object
当然,这会失败-因此<code>IList
顺便说一句,还有一个选项用于
in
- 它被比较接口之类的东西使用。IComparer
问题内容: 假设我有一个表,该表的列的取值范围是1到10。我需要选择除9和10以外的所有值的列。使用此查询时是否会有区别(在性能方面): 和这个? 问题答案: 当涉及到性能,你应该总是分析代码(即运行查询数千次,并使用某种测量每个回路的性能。样品)。 但是在这里,我强烈建议您使用第一个查询来更好地维护将来。逻辑是您需要除9和10之外的所有记录。如果将值11添加到表中并使用第二个查询,则应用程序的逻
问题内容: 我的数据库中有2个表。一种是用于订单,一种是用于公司。 订单具有以下结构: 公司具有以下结构: 要获取订单的公司名称,我可以这样查询: 该查询工作正常,但以下查询却无法正常工作。 为什么第一个查询有效但第二个查询无效? 第一个查询返回: 第二个查询仅返回: 为什么会这样,为什么第一个查询返回所有公司,而第二个查询仅返回第一个公司? 问题答案: 是转换为(的类型)的标量值。 强制转换仅返
问题内容: 前几天,我在调试一个存储过程,发现一些类似这样的逻辑: 这什么也没返回。我以为它与“ <>”看起来有点奇怪,所以我将其更改为“ NOT IN”,然后一切正常。我想知道为什么会这样?这是一个非常古老的过程,我不确定该问题已经解决了多长时间,但是当发现此问题时,我们最近从SQL Server 2005切换到了SQL Server 2008。“ <>”和“ NOT IN”之间的真正区别是什么
问题内容: 我正在尝试使用scala json库Circe,将其包装在一个简单的特征中以提供往返于json的转换,我对此具有以下要求: 这样做的目的是简单地能够用任何对象调用JsonConverter并将其转换成json之类的东西,但是当我尝试对其进行编译时,我得到以下信息: 我当然可以拥有一个类,打算通过转换器放入的所有内容都继承自该类,但是我有一个印象,大约可以自动生成编码器/解码器? 问题答
问题内容: 我如何将IN表与like一起使用?这样我就可以在其中使用%了?我的意思是: 我已经尝试过: 但是它给出了错误“操作数应包含1列” 问题答案: 您可以使用许多LIKE表达式: 或者您可以使用正则表达式: 或者,巧妙地
问题内容: 我有一个关于Swift中泛型的快速问题。问题是我试图存储一个以泛型为参数的变量,但是无法将其强制转换为它所限制的类型。最好在一个简短的示例中进行解释: 上面的代码产生错误: 因为T被限制为Foo的子类,它 不 应该 永远不会 失败吗?我一定会误解泛型在Swift中的工作方式,任何指导或帮助将不胜感激! 问题答案: Swift泛型不是协变的。就是说,错误确切说明了什么:即使是,您也无法自