在C#语言规范v5.0的1.3节中,它说:
接口类型的内容可以是空引用,也可以是对引用的引用 实现该接口类型的类类型的实例,或者 引用实现该值的值类型的盒装值 界面类型
对于这些陈述中的两个,我没有问题。然而,最后一个让我困惑。接口类型如何保存实现该接口类型的值类型的盒装值?我认为值类型无法实现接口类型?或者是说盒装值实现了接口类型?如果是这种情况,盒装值如何实现接口类型?
我在理解所有这些方面遇到了麻烦。
答案 0 :(得分:11)
值类型(struct
)可以实现接口。它不能继承另一个struct
,但可以实现接口。
结构可以实现一个接口,但它们不能从另一个结构继承。因此,不能将struct成员声明为protected。
所以当你有一个struct
来实现IInterface
时你就会这样做:
var value = new MyStruct();
var valueAsInterface = (IInterface)value;
valueAsInterface
包含对实现该接口类型的值类型的盒装值的引用。
答案 1 :(得分:5)
没有任何内容表明值类型无法实现接口。
以下代码完全合法:
interface ITest
{
void DoSomething();
}
struct MyTest : ITest
{
public void DoSomething()
{
// do something
}
}
答案 2 :(得分:1)
以下是一个例子:
interface DisplayMsg
{
void ShowMsg();
}
/// <summary>
/// Interface implemented by Struct
/// </summary>
struct StructDisplayMsg : DisplayMsg
{
public void ShowMsg()
{
Console.WriteLine("Inside struct Showmsg:");
}
}
/// <summary>
/// Interface implemented by Class
/// </summary>
class ObjectDisplayMsg:DisplayMsg
{
public int Integer { get; set; }
public void ShowMsg()
{
Console.WriteLine("Inside Object ShowMsg:{0}", Integer);
}
/// <summary>
/// Implicit operator for boxing value type to object
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static implicit operator ObjectDisplayMsg(int value)
{
ObjectDisplayMsg classObject = new ObjectDisplayMsg();
classObject.Integer = value;
return classObject;
}
}
private void CheckConcepts()
{
StructDisplayMsg localDisplay = new StructDisplayMsg();
localDisplay.ShowMsg();
int localInteger = 10;
/* Boxing of the integer type to Object */
ObjectDisplayMsg intobject = (ObjectDisplayMsg)localInteger;
intobject.ShowMsg();
Console.ReadKey();
}