c# - 将结构转换为继承自同一接口(interface)的类

标签 c# inheritance struct interface casting

与同事一起挑战是否有任何方法可以将结构转换为类(这里是我们尝试过的示例)

 namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {

            IFoo fooS = new FooStruct();
            fooS.Val = 5; 

            FooClass foo =(FooClass) fooS;

        }
    }
    public interface IFoo
    {

        int Val { get; set; }
    }
    public struct FooStruct : IFoo
    {
        public int Val { get; set; }
    }
    public class FooClass : IFoo
    {
        //public FooClass(int val)
        //{

        //}
        private int val;
        public int Val
        {
            get { return val; }
            set { val = value; }
        }
    }
}

但是我们遇到了无效的转换异常:D
考虑到接口(interface)是引用类型并且类是引用类型并且类实现了接口(interface),是否有任何棘手的方法来提取接口(interface)并将其分配给类

最佳答案

您不能通过接口(interface)直接在两者之间进行转换,这是不允许的,因为它们彼此不直接相关(即继承)。

编译器可以捕获很多此类内容,甚至不允许强制转换进行编译。如果编译器无法执行此操作,则运行时会执行此操作。对于显式转换,运行时将在失败的转换时引发异常,对于隐式转换(仅限引用类型)的尝试,运行时将返回 null 并且不会引发异常。

类型检查实际上检查 FooStruct FooClass,但事实并非如此。

但是,您可以使用强制转换运算符在它们之间进行转换,使其看起来像强制转换

class Program
{
    static void Main(string[] args)
    {
        FooStruct f = new FooStruct();
        f.Val = 2;

        FooClass f2 = (FooClass)f;

        Console.Read();
    }
}

class FooClass : IFoo
{
    public static explicit operator FooClass(FooStruct f)
    {
        FooClass foo = new FooClass();
        foo.Val = f.Val;
        return foo;
    }

    public int Val { get; set; }
}



struct FooStruct : IFoo
{
    public int Val { get; set; }

    public static explicit operator FooStruct(FooClass f)
    {
        FooStruct foo = new FooStruct();
        foo.Val = f.Val;
        return foo;
    }
}


// This interface has little use in this scenario.
interface IFoo
{
    int Val { get; set; }
}

不要将转换与转换混淆。另外,在将接口(interface)应用于 struct 类型时要小心,因为可能会发生装箱。

关于c# - 将结构转换为继承自同一接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27940438/

相关文章:

c++ - 如何防止静态类成员变量需要两个定义/声明?

c# - 通过反射从类型继承

c# - 使用重复的节点模式解析 XML

c# - .NET:如何判断编码是否支持我的字符串中的所有字符?

c# - 使用System.Windows;不是名字空间

c++ - 使用基类指针调用带有派生类参数的模板化函数

scala - 强制 Scala 特征不兼容

C++ 在多级继承的情况下对 vtable 的 undefined reference

c++ - 调用结构默认析构函数?

C 如何从结构中建立结构