4

假设您有自己的课程,如下所示:

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);

没有它说明没有从字符串到整数的隐式转换?

[是的,我可以自己测试它,但我想我会把它放在那里,看看所有大师都怎么说]

4

4 回答 4

10

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

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

于 2009-10-23T03:05:14.843 回答
1

它似乎不起作用。它至少需要一个显式强制转换。那好吧...

于 2009-10-23T02:27:57.913 回答
1

我相当肯定这在 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 需要类型匹配器执行更多的工作,至少遵循指定的算法。

于 2009-10-23T02:58:50.927 回答
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是 type StringToInt,您的用法应该有效。

于 2009-10-23T02:25:29.713 回答