【发布时间】:2021-10-24 11:39:02
【问题描述】:
我正在学习“逆变泛型委托”。
我的理解是:
“in”关键字指定类型参数是逆变的。
这允许隐式转换委托类型。如果没有“in”关键字,我们不知道类型参数是否是逆变的。
那么委托类型的隐式转换是不允许的。
这是我的代码:
public class Test
{
//public delegate bool FuncDelegate<T>(T t);
public delegate bool FuncDelegate<in T>(T t);
public class BaseClass
{
public int x;
}
public class DerivedClass: BaseClass
{
public int y;
}
static bool BaseFunc(BaseClass bc)
{
if (bc.x > 1)
return false;
else
return true;
}
static bool DerivedFunc(DerivedClass dc)
{
if (dc.y > 1)
return false;
else
return true;
}
public static void Main()
{
FuncDelegate<DerivedClass> genericDerivedFunc = DerivedFunc;
FuncDelegate<BaseClass> genericBaseFunc = BaseFunc;
genericDerivedFunc = genericBaseFunc;
FuncDelegate<DerivedClass> genericDerivedFunc2 = BaseFunc;
}
}
我的问题
/*
This line is valid when declared as: public delegate bool FuncDelegate<in T>(T t);
This line is invalid when declared as: public delegate bool FuncDelegate<T>(T t);
*/
genericDerivedFunc = genericBaseFunc;
这句话与我的理解一致。
/*
This line is always valid.
*/
FuncDelegate<DerivedClass> genericDerivedFunc2 = BaseFunc;
我不明白这一行:
"bool BaseFunc(BaseClass bc)" 可以隐式转换为 bool "FuncDelegate
(DerivedClass t)"。
我认为它必须有“in”关键字来指定逆变。
但是不用“in”关键字也可以进行转换。
【问题讨论】:
-
没有真正回答我的问题。
标签: c# generics inheritance delegates contravariant