gpt4 book ai didi

c# - 泛型类型和表达式的协变

转载 作者:行者123 更新时间:2023-11-30 13:01:33 25 4
gpt4 key购买 nike

我试图在我的程序中使用协方差,但是当我使用 Expression<Func<T>> 时在我的方法中作为参数,我得到以下错误

Parameter must be input-safe. Invalid variance.
The Type parameter T must be invariently valid on 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 Lippertanswer :

The "out" means "T is only used in output positions". You are using it in an input position

(即使它是 Func 委托(delegate)的返回类型)。如果编译器允许,您可以编写(在您的示例中):

static void Main(string[] args)
{
var temp = new Temp<People>();
TestMethod(temp);
}

public static void TestMethod(ITemp<Organism> param)
{
param.SecondPrint(() => new Animal());
}

调用 SecondPrintTemp<People> , 但传递一个返回 Animal 的 lambda .

我会删除 T 上的方差注释:

interface ITemp<T> where T : Organism
{
void SecondPrint(Expression<Func<T>> parameter);
}

并制作TestMethod参数化 T :

public static void TestMethod<T>(ITemp<T> param) where T : Organism
{
}

关于c# - 泛型类型和表达式的协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18786944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com