gpt4 book ai didi

c# - 为什么 Type.IsGenericType 为 Task 返回 TRUE 而没有通过方法反射获得的返回类型但 typeof(Task).IsGenericTyp 返回 FALSE

转载 作者:行者123 更新时间:2023-11-30 21:32:12 25 4
gpt4 key购买 nike

谁能解释一下?根据文档 IsGenericType

indicatesing whether the current Type represents a type parameter in the definition of a generic type or method.

所以这个 (LINQPad) 代码:

bool bStraight = typeof(Task).IsGenericType;
bStraight.Dump("typeof(Task).IsGenericType");

按预期工作并产生输出:

typeof(Task).IsGenericType
False

但是当我通过反射从方法中检索它时:

public class MyClass
{
public async Task Method()
{
await Task.Run(() =>
{
Thread.Sleep(3000);
});
}
}

public async Task TEST()
{
MyClass theObject = new MyClass();

Task task = (Task)typeof(MyClass).GetTypeInfo()
.GetDeclaredMethod("Method")
.Invoke(theObject, null);

bool b = task.GetType().IsGenericType;
bool b2 = task.GetType().GetGenericTypeDefinition() == typeof(Task<>);
b.Dump("IsGenericType");
b2.Dump("GetGenericTypeDefinition");

bool bStraight = typeof(Task).IsGenericType;
bStraight.Dump("typeof(Task).IsGenericType");
}

我得到了意外的输出:

IsGenericType
True

GetGenericTypeDefinition
True

最佳答案

在某些情况下,框架返回 Task<VoidTaskResult>伪装成 Task .想象一下,您有一些逻辑依赖于 TaskCompletionSource<T> .如果您实际上不打算返回结果,您仍然必须填写 T通用参数。你可以使用 TaskCompletionSource<object> ,但你会浪费一个指针值的内存(32 位中为 4 个字节,64 位中为 8 个字节)。为避免这种情况,框架使用空结构:VoidTaskResult .

关于c# - 为什么 Type.IsGenericType 为 Task 返回 TRUE 而没有通过方法反射获得的返回类型但 typeof(Task).IsGenericTyp 返回 FALSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52447267/

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