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

时间:2009-10-23 02:12:46

标签: c# casting implicit-cast

假设你有一个类似以下的课程:

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的隐式转换?

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

4 个答案:

答案 0 :(得分:10)

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

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我相当确定在C#3.0下这是不可能的。 the reference中涵盖转化的部分为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将需要更多工作由类型匹配器执行,至少遵循指定的算法。

答案 3 :(得分:0)

你的片段中的错别字:

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,则您的使用情况应该有效。