泛型类型和表达式的协方差
本文关键字:方差 表达式 泛型类型 | 更新日期: 2023-09-27 18:31:22
我正在尝试在我的程序中使用协方差,但是当我在方法中使用Expression<Func<T>>
作为参数时,出现以下错误
参数必须是输入安全的。差异无效。
类型参数 T 必须始终对Expression <TDelegate>
有效
有没有办法在方法中使用表达式作为参数以及协方差?
下面的示例
class Program
{
static void Main(string[] args)
{
var temp = new Temp<People>();
TestMethod(temp);
}
public static void TestMethod(ITemp<Organism> param)
{
}
}
class Temp<T> : ITemp<T>
where T : Organism
{
public void Print() {}
public void SecondPrint(Expression<Func<T>> parameter) {}
}
class People : Organism {}
class Animal : Organism {}
class Organism {}
interface ITemp<out T> where T : Organism
{
void SecondPrint(Expression<Func<T>> parameter);
}
看看 Eric Lippert 的回答:
"out"表示"T仅用于输出位置"。您在输入位置使用它
(即使它是Func
委托的返回类型)。如果编译器允许,您可以编写(在您的示例中):
static void Main(string[] args)
{
var temp = new Temp<People>();
TestMethod(temp);
}
public static void TestMethod(ITemp<Organism> param)
{
param.SecondPrint(() => new Animal());
}
在 Temp<People>
上调用 SecondPrint
,但传递返回Animal
的 lambda 。
我会删除T
上的方差注释:
interface ITemp<T> where T : Organism
{
void SecondPrint(Expression<Func<T>> parameter);
}
并在T
中TestMethod
参数化:
public static void TestMethod<T>(ITemp<T> param) where T : Organism
{
}