我只是偶然发现了这段我不理解的代码:

public class RunBuilder : IServiceBuilder
{
    public void Match<T>(Action<T> callback) where T : class, IServiceBuilder
     {
        if (callback == null)
            throw new ArgumentNullException(nameof(callback));

            if (this is T self)
                callback(self);
        }
}

100到底是做什么的?我找不到它的任何链接,也找不到我应该搜索的内容!

推荐答案

这就是所谓的declaration pattern,它基本上执行强制转换,如果成功,则将值赋给可以在if块内使用的T self变量.你可以用反编译器来查看它.例如,@sharplab.io将其反编译为类似以下内容:

[System.Runtime.CompilerServices.NullableContext(1)]
public void Match<T>(Action<T> callback) where T : class
{
    // ...
    T self = this as T;
    if (self != null)
    {
        callback(self); 
    }
}

另见:

Csharp相关问答推荐

如何打印已添加到List的Linq值,而不是C#中的:System.Collections.Generic.List ' 1[System.Int32]?

如何将字节数组转换为字符串并返回?

使用变量子根名称在C#中重新初始化SON文件

哪个nuget包含SecurityStampValidatorOptions

try 还原包时出错:Dapper已经为System.Data.SQLClient定义了依赖项''''

使用C#中的SDK在Microsoft Graph API上使用SubscribedSkus的问题

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

附加标题不起作用,而添加则起作用

如何使用C#获取FireStore中的列表输出文档

取决于您的数据量的多个嵌套循环

在.NET 8最低API中从表单绑定中排除属性

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

为什么我不能从我的异步任务方法中返回异步任务方法?

我的命名管道在第一次连接后工作正常,但后来我得到了System.ObjectDisposedException:无法访问关闭的管道

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

C#命名管道-编码错误?

C#无法将.csv列转换为用于JSON转换的列表

Cmd中的&ping.end()";有时会失败,而";ping";总是有效

处理方法内部过滤与外部过滤

同时通过多个IEumable<;T&>枚举