default(CancellationToken)
确实创建了CancellationToken
where m_source
is null
。您可以通过使用反射获取该私有字段的值来看到这一点:
Console.WriteLine(typeof (CancellationToken).
GetField("m_source", BindingFlags.NonPublic | BindingFlags.Instance).
GetValue(default(CancellationToken)) ?? "null");
输出:
null
您还可以通过仅在调试器中固定相关字段来看到这一点:
![无效的](https://i.stack.imgur.com/yGpi9.png)
那么,会发生什么?
调试器为了显示 的内容,会CancellationToken
一一访问其属性。当内部CancellationTokenSource
是属性时,在委托给它的属性之前null
创建WaitHandle
并设置一个默认值:CancellationTokenSource
WaitHandle
public WaitHandle WaitHandle
{
get
{
if (m_source == null)
{
m_source = CancellationTokenSource.InternalGetStaticSource(false);
}
return m_source.WaitHandle;
}
}
总之,default(CancellationToken)
创建new CancellationToken
一个空结构 where m_source
isnull
但是通过查看调试器中的结构,您正在CancellationTokenSource
使用无法取消的默认实例填充该字段。