您可以在 C# 中指定使用站点差异吗?
Can you specify use site variance in C#?
C# 是否有等同于 Java 的通配符?我知道 C# 有声明站点差异。但是,我想知道该语言是否提供了指定使用地点差异的选项。这是我正在寻找的示例:
class Parent {}
class Child : Parent {}
class Grandchild : Child {}
interface IProducer<out T>
{
T produces();
}
interface IConsumer<in T>
{
void consumes(T p);
}
class Collection<T> : IProducer<T>, IConsumer<T>
where T:new()
{
private readonly T _v;
public Collection()
{
_v = new T();
}
public T produces()
{
return _v;
}
public void consumes(T p)
{
//
}
public static void Main(string[] args)
{
Collection<Child> coll = new Collection<Child>(); // Invariance
IProducer<Parent> producer = coll; // Producer using declaration site variance and segregating by interface
IConsumer<Grandchild> consumer = coll; // Consumer using declaration site variance and segregating by interface
// Equivalent of Collection<? extends Parent> producer = coll; ?
// Equivalent of Collection<? super Grandchild> producer = coll; ?
}
}
不,C# 只支持声明站点变量。
C# 是否有等同于 Java 的通配符?我知道 C# 有声明站点差异。但是,我想知道该语言是否提供了指定使用地点差异的选项。这是我正在寻找的示例:
class Parent {}
class Child : Parent {}
class Grandchild : Child {}
interface IProducer<out T>
{
T produces();
}
interface IConsumer<in T>
{
void consumes(T p);
}
class Collection<T> : IProducer<T>, IConsumer<T>
where T:new()
{
private readonly T _v;
public Collection()
{
_v = new T();
}
public T produces()
{
return _v;
}
public void consumes(T p)
{
//
}
public static void Main(string[] args)
{
Collection<Child> coll = new Collection<Child>(); // Invariance
IProducer<Parent> producer = coll; // Producer using declaration site variance and segregating by interface
IConsumer<Grandchild> consumer = coll; // Consumer using declaration site variance and segregating by interface
// Equivalent of Collection<? extends Parent> producer = coll; ?
// Equivalent of Collection<? super Grandchild> producer = coll; ?
}
}
不,C# 只支持声明站点变量。