带有转换运算符的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!
}
}
o
的编译时类型只是object
,所以编译器不"知道"您的转换。
除了说"不要那样做"之外,很难知道解决问题的最佳方案——如果你使用dynamic
而不是object
(当然,你使用的是C#4),那么它会起作用——但就我个人而言,我只会尝试而不是来依赖这样的用户定义转换。他们让代码库很难理解,IMO.
任何读取表达式(string) o
(其中o
只是object
)的人都会期望它是一个简单的强制转换,即如果o
实际上没有引用字符串(或是空引用),则该强制转换将失败。试图找到混淆这种期望的方法是个坏主意,IMO.
我会覆盖您类中的ToString
。然后使用o.ToString()
而不是(string)o
。