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

我有一个通用的方法,可以给出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相关问答推荐

TDLib与机器人共享电话号码

Microsoft. VisualBasic. FileIO. FileSystem. MoveFile()对话框有错误?

如何使用NumberFormatInfo

当前代码Cosmos DB 3.37.1:PartitionKey key key mismatch exception

我的MRG32k3a算法实现返回的数字超出了预期的[0,1]范围

C#Null判断处理失败

未在数据流块之间传播完成

该函数不能检测两条曲线的交点

如果是,我怎么才能让这个加75,如果不是,我怎么才能减go 100?

泛型参数在.NET 8 AOT中没有匹配的批注

将操作从编辑页重定向到带参数的索引页

为什么此名称不再被识别?名称不存在于当前上下文中?

Azure函数-在外部启动类中生成配置时出错

如何强制新设置在Unity中工作?

C#如何获取字符串中引号之间的文本?

将字符串类型日期输入(yyyy-mm-ddthh:mm:ss)转换为MM/dd/yyyy格式

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

无法使用直接URL通过PictureBox.ImageLocation加载图像

自定义ConsoleForMatter中的DI/Http上下文

引用类型中的值类型属性是否包含装箱的值?