我有问题要弄明白这个问题.

我有一个通用的方法,可以给出Action<T>来处理一些事情.但我不能将这个对象转换为T.

public interface T1 { }

public interface A : T1
{
    void A1();
}

public interface B : T1
{
    void A1();
}

public class Test : A, B
{
    void A.A1()
    {
        Console.WriteLine("A");
    }

    void B.A1()
    {
        Console.WriteLine(  "B");

    }

    public void T100<T>(Action<T> call) where T : T1
    {
        call((T)this); // error comes from here
    }
}

这个代码有什么问题?

请告诉我,我怎样才能创造出像上面这样的东西.

推荐答案

该错误是由于编译器不能保证正确和安全地完成强制转换.

您可以使用C#模式匹配:

public void T100<T>(Action<T> call) where T : T1
{
    if (this is T instance)
    {
        call(instance);
    }
    else
    {

    }
}

Usage:

Test test = new Test();
test.T100<A>(firstIstance=> firstIstance.A1()); // This will output "A"
test.T100<B>(secondIstance => secondIstance.A1()); // This will output "B"

Csharp相关问答推荐

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

ASP.NET Core -是否可以对所有最小API端点应用过滤器?

Regex在c#中完全匹配

Blazor:类型或命名空间名称Components在命名空间中不存在''

向类注入一个工厂来创建一些资源是一个好的实践吗?

错误401未授权ASP.NET Core.使用JWT创建身份验证/授权

Unity 2D自顶向下弓旋转

如何使用C#Interop EXCEL创建度量衡

只有第一个LINQ.Count()语句有效

Quartz调度程序不调用作业(job)类

Rider将.NET安装在哪里

为什么在使用动态obj+类obj时会调用串联?

为具有实体框架后端的Reaction项目 Select 正确的Visual Studio模板

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

Swagger没有显示int?可以为空

是否有必要在ASP.NET Core中注册可传递依赖项?

交替的奇数

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

如何在Cake脚本中设置MSBuild.exe的绝对路径

实例化列表时的集合表达式是什么?