当你从抽象/接口转换到接口时,有没有人可以解释场景背后的真实情况?
示例:假设AbstractClasse a = new Concrete()
和Concrete
实现了IText
接口和AbstractClasse
,我们说IText = (IText)a
。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
interface IText
{
string ToText();
}
class Subtip : SubtitleFormat, IText
{
public int Error { get; set; }
public Subtip(int error)
{
Error = error;
}
public string ToText()
{
return $"{Error}, Hello!";
}
}
abstract class SubtitleFormat
{
protected int _errorCount = 1;
public int ErrorCount
{
get
{
return _errorCount;
}
}
}
static void Main(string[] args)
{
SubtitleFormat sb = new Subtip(10);
IText sb2 = sb as IText;
Console.WriteLine(sb.ErrorCount);
Console.WriteLine((sb as Subtip).Error);
Console.WriteLine(sb2.ToText());
Console.ReadLine();
}
}
}
答案 0 :(得分:1)
当您转换为接口或类时,使用正确类型的对象来确定它是否与目标兼容。目前输入的对象与object
,interface
,最终class
或基本class
无关。
所以,例如,你可以这样做:
SubtitleFormat sb = new Subtip(10);
IText sb2 = sb as IText;
Subtip sb3 = sb2 as Subtip;
这两个转换都是有效的,因此在它结束时sb3
将具有非空值。所有三个变量(sb
,sb2
和sb3
)都将引用同一个对象,因此Object.ReferenceEquals(sb, sb3)
将为真。
因为对象实例的真实类型用于确定转换是否有效,所以不会工作:
public class NotIText : SubtitleFormat
{
public string ToText()
{
return "";
}
}
static void Main(string[] args)
{
SubtitleFormat sb = new NotIText();
IText sb2 = sb as IText;
}
答案 1 :(得分:0)
类类型的值可以转换为类型对象或由类实现的接口类型,只需在编译时将引用视为另一种类型即可。同样,类型对象的值或接口类型的值可以转换回类类型而不更改引用(但在这种情况下,当然需要运行时类型检查)。
来源: CSharp语言规范