我在
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
。
有人可以解释一下我在这里缺少什么吗?我对接口和转换的理解不正确吗?如果我想使用实现相同接口的不同类,我应该如何处理这个问题?
预先感谢您的帮助!
您可以将链向上转换为不太具体的实现(即:从 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