带有转换运算符的C#铸造

本文关键字:铸造 运算符 转换 | 更新日期: 2023-09-27 18:22:42

我有一个字符串类的自定义实现。我在字符串和类之间添加了自定义转换运算符,并且转换工作正常。但是,如果我先将自定义对象强制转换为System.object,然后再转换为字符串,它会说:"无法将类型‘MyString’强制转换为类型‘System.string’"。为什么?我如何启用它…

class MyString
{
    public string S {get; set;}
    public MyString(string s)
    {
        this.S = s;
    }
    public static implicit operator string(MyString s)
    {
        return s.S;
    }
    public static implicit operator MyString(string s)
    {
        return new MyString(s);
    }
}
class Program
{
    static void Main(string[] args)
    {
        MyString ms = new MyString("a");
        string s = ms;
        object o = ms;
        string s1 = (string)o; // <-- this throws the exception!
    }
}

带有转换运算符的C#铸造

像这样的转换必须在编译时确定,而在最后一行中,o的编译时类型只是object,所以编译器不"知道"您的转换。

除了说"不要那样做"之外,很难知道解决问题的最佳方案——如果你使用dynamic而不是object(当然,你使用的是C#4),那么它会起作用——但就我个人而言,我只会尝试而不是来依赖这样的用户定义转换。他们让代码库很难理解,IMO.

任何读取表达式(string) o(其中o只是object)的人都会期望它是一个简单的强制转换,即如果o实际上没有引用字符串(或是空引用),则该强制转换将失败。试图找到混淆这种期望的方法是个坏主意,IMO.

我会覆盖您类中的ToString。然后使用o.ToString()而不是(string)o