值类型如何实现接口类型?

时间:2014-01-25 00:13:17

标签: c# interface value-type boxing

在C#语言规范v5.0的1.3节中,它说:

  

接口类型的内容可以是空引用,也可以是对引用的引用   实现该接口类型的类类型的实例,或者   引用实现该值的值类型的盒装值   界面类型

对于这些陈述中的两个,我没有问题。然而,最后一个让我困惑。接口类型如何保存实现该接口类型的值类型的盒装值?我认为值类型无法实现接口类型?或者是说盒装值实现了接口类型?如果是这种情况,盒装值如何实现接口类型?

我在理解所有这些方面遇到了麻烦。

3 个答案:

答案 0 :(得分:11)

值类型(struct可以实现接口。它不能继承另一个struct,但可以实现接口。

  

struct (C# Reference)

     

结构可以实现一个接口,但它们不能从另一个结构继承。因此,不能将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();
}