C#:如何在对象类型转换期间使用隐式强制转换操作符?

Nik*_*y R 4 c# enums casting

HI!

这是我的情况:我有一些值类型,它包含在具有适当隐式转换器的另一种类型中.如果我将包装类型转换为对象然后尝试获取原始值,我只能在两步转换中执行此操作.如果简化我的代码如下:

public enum MyEnum : int
    {
        First,
        Second
    }


    public class Test<T>
    {
        public Test(T val)
        {
            Value = val;
        }

        private T Value { get; set; }


        public static implicit operator T(Test<T> m)
        {
            return m.Value;
        }

        public static implicit operator Test<T>(T m)
        {
            var res = new Test<T>(m);
            return res;
        }
    }


    static void Main()
    {
        object res = new Test<MyEnum>(MyEnum.First);
        Console.WriteLine((MyEnum)(Test<MyEnum>)res);
        Console.WriteLine((MyEnum)res);
    }
Run Code Online (Sandbox Code Playgroud)

首先"Console.WriteLine"正常工作.第二个失败了.

有什么办法可以修改这个行为并让它在没有双重投射的情况下工作吗?

更新1

我必须使用object来进行值转换(在实际应用程序中我必须转换ComboBox.SelectedItem属性,我不想为ComboBox添加额外的属性,因为我必须在任何地方更改我的UI交互代码).

更新2

不允许与System.Object进行隐式转换.

更新3

更新了我的示例代码以反映整个问题.

Joe*_*orn 6

不要那样用object.写下你的第一行代替:

Test res = new Test(1);
Run Code Online (Sandbox Code Playgroud)

如果你必须首先在对象中拥有它,请记住所有编译器此时都知道它是一个对象,仅此而已.作为程序员,您可以获得有关您期望此对象的其他信息,但是为了使编译器能够利用该信息,您必须将其放入代码中.

更新:
我很高兴我能够再次找到这个,因为这篇关于C#语言设计的Eric Lippert几乎非常及时的文章今天早上起来并深入解释了这个问题:
http:// blogs .msdn.com/ericlippert /存档/ 2009/03/19 /表示和- identity.aspx