嗨!
这是我的情况:我有一些值类型,它通过适当的隐式转换器包装到另一种类型中。如果我将包装类型转换为一个对象,然后尝试获取原始值,我只能在两步转换中做到这一点。 如果简化我的代码如下:
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);
}
首先“Console.WriteLine”工作正常。第二个失败了。
有什么方法可以修改此行为并使其在不进行双重转换的情况下工作吗?
更新 1
我必须使用对象到值转换(在实际应用程序中我必须转换 ComboBox.SelectedItem 属性并且我不想向 ComboBox 添加额外的属性,因为我必须在所有地方更改我的 UI 交互代码)。
更新 2
不允许与 System.Object 进行隐式转换。
更新 3
更新了我的示例代码以反射(reflect)整个问题。
最佳答案
不要那样使用object
。改为这样写你的第一行:
Test res = new Test(1);
如果您必须首先将它放在一个对象中,请记住,此时编译器 所知道的只是它是一个对象,仅此而已。作为程序员,您有关于您期望此对象是什么的其他信息,但要让编译器利用该信息,您必须将其放入代码中的某个位置。
更新:
我很高兴能够再次找到它,因为从事 C# 语言设计工作的埃里克·利珀特 (Eric Lippert) 的这篇几乎非常及时的文章今天早上发表并深入解释了这个问题:
http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx
关于C#:如何在对象类型转换期间使用隐式强制转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/658797/