泛型类型和表达式的协方差

本文关键字:方差 表达式 泛型类型 | 更新日期: 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);
}

并在TTestMethod参数化:

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