Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';分配谓词<;T>;对谓词<;对象>;什么时候T是从对象派生的?_C#_Delegates - Fatal编程技术网

C# 为什么可以';分配谓词<;T>;对谓词<;对象>;什么时候T是从对象派生的?

C# 为什么可以';分配谓词<;T>;对谓词<;对象>;什么时候T是从对象派生的?,c#,delegates,C#,Delegates,标题说明一切。如果我有一块地 private Predicate<object> myPredicate; 私有谓词myPredicate; 为什么我不能分配一个 Predicate<T> 谓词 那个领域的实例 因为实现了逆变。所以你可以 Predicate<string> predString; Predicate<object> predObject = (object x) => x != null; predString

标题说明一切。如果我有一块地

private Predicate<object> myPredicate;  
私有谓词myPredicate;
为什么我不能分配一个

Predicate<T>
谓词
那个领域的实例

因为实现了逆变。所以你可以

Predicate<string> predString;
Predicate<object> predObject = (object x) => x != null;
predString = predObject;
“Foo”
predObject
(接受
对象
)的有效参数(字符串)

反之则不行:

非法代码

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

显然
newobject()
predString
的非法参数(需要
string
参数)

协变和逆变,我认为
谓词
实现逆变,因为否则你可以用一些不是T的东西来调用你的T谓词
Predicate<object> predObject;
Predicate<string> predString = (string x) => x.Length != 0;
predObject = predString;
bool result = predObject(new object());