c#编译器是否会执行多个隐式转换以从一种类型转换到另一种类型?

假设您有自己的类如下:

public sealed class StringToInt { private string _myString; private StringToInt(string value) { _myString = value; } public static implicit operator int(StringToInt obj) { return Convert.ToInt32(obj._myString); } public static implicit operator string(StringToInt obj) { return obj._myString; } public static implicit operator StringToInt(string obj) { return new StringToInt(obj); } public static implicit operator StringToInt(int obj) { return new StringToInt(obj.ToString()); } } 

那么您是否可以编写如下代码:

 MyClass.SomeMethodThatOnlyTakesAnInt(aString); 

没有它声明没有从字符串到int的隐式转换?

[是的,我可以亲自测试一下,但我想我会把它放在那里,看看所有的大师都要说的话]

我相当肯定在C#3.0下这是不可能的。 参考中涵盖转换的部分是6.4。 即,6.4.4“用户定义的隐式转换”。

它只涉及来自S-> T(而不是S-> T-> U)的转换,它涵盖了以下情况:

 StringToInt _t = "foo"; int t = _t; 

 int t = (StringToInt)"foo"; 

这两种情况都只涉及S-> T(两次)。

我很确定这在C#3.0中是不可能的。 允许S-> T-> U将需要更多类型匹配器执行的工作,至少遵循指定的算法。

没有C#不会调用多个用户定义的隐式转换。 从C#规范第6.4.3节:

评估用户定义的转换从不涉及多个用户定义或提升的转换运算符。 换句话说,从类型S到类型T的转换将永远不会首先执行从S到X的用户定义转换,然后执行从X到T的用户定义转换。

它似乎不起作用。 它至少需要一次显式演员表。 那好吧…

你的片段中有错别字:

 public StringToInt(string value) { _myString = value; } public static implicit operator int(StringToInt obj) { return Convert.ToInt32(obj._myString); } public static implicit operator string(StringToInt obj) { return obj._myString; } 

如果aString的类型为StringToInt ,则您的用法应该有效。