C# 中的接口实现和转换

问题描述 投票:0回答:1

我在

C#
中面临着接口的概念挑战。据我了解,接口充当契约,任何实现接口的类都同意遵守该契约。鉴于此,我很困惑为什么我不能将接口的实例强制转换为任何实现它的类。

这是我想要实现的目标的简化版本:

public interface IMyInterface
{
    string MyString { get; set; }
    int MyInt { get; set; }
}

public class ClassA: IMyInterface
{
    public string MyString { get; set; } = null!;
    public int MyInt { get; set; }
}

public class ClassB : IMyInterface
{
    public string MyString { get; set; } = null!;
    public int MyInt { get; set; }
}

public class CastTest
{
    public static void TestCast(IMyInterface myInterface)
    {
        CastAgain((ClassB)myInterface);
    }

    private static void CastAgain(ClassB myInterface)
    {
        // Some logic here
    }
}

// Example usage
CastTest.TestCast(new ClassA());

执行

CastTest.TestCast(new ClassA());
时,会出现
InvalidCastException
。我的理解是,由于 ClassA 和 ClassB 都实现了 IMyInterface,所以我应该能够将
IMyInterface
的实例转换为
ClassA
ClassB

有人可以解释一下我在这里缺少什么吗?我对接口和转换的理解不正确吗?如果我想使用实现相同接口的不同类,我应该如何处理这个问题?

预先感谢您的帮助!

c# class inheritance interface casting
1个回答
0
投票

您可以将链向上转换为不太具体的实现(即:从 ClassB 或 ClassA 到 IMyInterface),但您必须先检查 IMyInterface 实例的特定类型,然后才能转换为它。

var a  = new ClassA();

var i  = (IMyInterface)a; // works (going up the type chain)

var aFromI = i as ClassA; // works (going back to more specific instance)

var bFromI = i as ClassB; // would be null as underlying instance is not ClassB
© www.soinside.com 2019 - 2024. All rights reserved.