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

C# 值类型如何实现接口类型?,c#,interface,value-type,boxing,C#,Interface,Value Type,Boxing,在C语言规范v5.0的第1.3节中,它说: 接口类型的内容可以是null引用,即对 实现该接口类型的类类型的实例,或 对值类型的装箱值的引用,该值类型实现 接口类型 我对其中三分之二的陈述没有异议。然而,最后一个让我困惑。接口类型如何保存实现该接口类型的值类型的装箱值?我以为值类型不能实现接口类型?还是说装箱的值实现了接口类型?如果是这样,装箱的值如何实现接口类型 我在理解所有这些方面有点困难。值类型(struct)可以实现接口。它不能继承另一个结构,但可以实现接口 结构可以实现接口,但不能从

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

接口类型的内容可以是null引用,即对 实现该接口类型的类类型的实例,或 对值类型的装箱值的引用,该值类型实现 接口类型

我对其中三分之二的陈述没有异议。然而,最后一个让我困惑。接口类型如何保存实现该接口类型的值类型的装箱值?我以为值类型不能实现接口类型?还是说装箱的值实现了接口类型?如果是这样,装箱的值如何实现接口类型

我在理解所有这些方面有点困难。

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

结构可以实现接口,但不能从另一个结构继承。因此,结构成员不能声明为受保护

因此,当您有一个实现
i接口的
struct
时,您可以执行以下操作:

var value = new MyStruct();
var valueAsInterface = (IInterface)value;

valueAsInterface
包含对实现该接口类型的值类型的装箱值的引用。

没有任何东西表明值类型不能实现接口

以下代码完全合法:

interface ITest
{
    void DoSomething();
}

struct MyTest : ITest
{
    public void DoSomething()
    {
        // do something
    }
}
以下是一个例子:

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();
}
界面显示msg
{
void ShowMsg();
}
/// 
///由Struct实现的接口
/// 
structStructDisplayMsg:DisplayMsg
{
public void ShowMsg()
{
Console.WriteLine(“内部结构Showmsg:”);
}
}
/// 
///类实现的接口
/// 
类ObjectDisplayMsg:DisplayMsg
{
公共整数{get;set;}
public void ShowMsg()
{
WriteLine(“内部对象ShowMsg:{0}”,整数);
}
/// 
///用于将值类型装箱到对象的隐式运算符
/// 
/// 
/// 
公共静态隐式运算符ObjectDisplayMsg(int值)
{
ObjectDisplayMsg classObject=新的ObjectDisplayMsg();
整型=值;
返回类对象;
}
}
私有void CheckConcepts()
{
StructDisplayMsg localDisplay=新建StructDisplayMsg();
localDisplay.ShowMsg();
int localInteger=10;
/*将整型装箱到对象*/
ObjectDisplayMsg InObject=(ObjectDisplayMsg)localInteger;
intobject.ShowMsg();
Console.ReadKey();
}

您能不能说
i接口值接口=值
?可以。不会有任何区别(除非在结构中重写了cast运算符)。为什么需要框选实现接口类型的值类型?所有这些行话让我头晕目眩。每次你把它传递给一个需要接口的方法时,它都会被装箱。当显式实现接口时,您也会发现它是有用的。字体它是否使用full?这是什么意思?这是一个很好的问题