4

我试图在我的程序中使用协方差,但是当我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);
    }
4

1 回答 1

0

请参阅此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());
}

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

我会删除方差注释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
{
}
于 2013-10-14T13:54:56.053 回答