当T从对象下降时,为什么不能将Predicate <t>分配给Predicate <object>?

时间:2016-03-16 12:58:02

标签: c# delegates

标题说全部。如果我有一个字段

private Predicate<object> myPredicate;  

为什么我不能分配

Predicate<T>

那个领域的实例?

1 个答案:

答案 0 :(得分:3)

因为Predicate<in T>实现了逆转。所以你可以

Predicate<string> predString;
Predicate<object> predObject = (object x) => x != null;
predString = predObject;

但不是相反。

请参阅https://msdn.microsoft.com/en-us/library/ee207183.aspx

如果你想到它的第二个,这是合乎逻辑的......在我给出的例子中,

bool result = predString("Foo");

"Foo"string的有效参数(predObject)(接受object)。

反之亦然:

非法代码

Predicate<object> predObject;
Predicate<string> predString = (string x) => x.Length != 0;
predObject = predString;

然后

bool result = predObject(new object());

显然new object()predString的非法参数(需要string参数)!