<out T>和<T>之间的区别是什么?例如:
public interface IExample<out T>
{
...
}
vs.
public interface IExample<T>
{
...
}
<out T>和<T>之间的区别是什么?例如:
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) { }
接受icovariant蒙皮<Fruit>的函数将能够接受icovariant蒙皮<Fruit>或icovariant蒙皮<Banana>,因为icovariant蒙皮<T>是一个协变接口,香蕉是一种水果,
接受ISkinned<Fruit>的函数将只能接受ISkinned<Fruit>。
其他回答
“out T”意味着T型是“协变的”。这限制了T仅作为泛型类、接口或方法的方法中的返回(出站)值出现。这意味着您可以将类型/接口/方法转换为具有T超类型的等效类型。 例:ICovariant<out Dog>可以施放到ICovariant<Animal>。
考虑,
class Fruit {}
class Banana : Fruit {}
interface ICovariantSkinned<out T> {}
interface ISkinned<T> {}
函数,
void Peel(ISkinned<Fruit> skinned) { }
void Peel(ICovariantSkinned<Fruit> skinned) { }
接受icovariant蒙皮<Fruit>的函数将能够接受icovariant蒙皮<Fruit>或icovariant蒙皮<Banana>,因为icovariant蒙皮<T>是一个协变接口,香蕉是一种水果,
接受ISkinned<Fruit>的函数将只能接受ISkinned<Fruit>。
我认为VS2022的这张截图是非常描述性的——它说明了这对泛型施加了什么样的约束:
为了方便地记住in和out关键字(以及协方差和逆变)的用法,我们可以将继承图像包装为:
String : Object
Bar : Foo
从你发布的链接....
对于泛型类型参数,out关键字指定类型 参数是协变的。
编辑: 还是从你发布的链接
更多信息请参见Covariance and contravance (c# and Visual Basic)。http://msdn.microsoft.com/en-us/library/ee207183.aspx