【问题标题】:Does implicit operator have higher priority over ToString() method? [duplicate]隐式运算符是否比 ToString() 方法具有更高的优先级? [复制]
【发布时间】:2014-11-29 12:51:53
【问题描述】:

考虑以下代码:

public class Test
{
    public static implicit operator int(Test t) { return 42; }
    public override string ToString() { return "Test here!"; }
}

var test = new Test();
Console.WriteLine(test); // 42
Console.WriteLine((Test)test); // 42
Console.WriteLine((int)test); // 42
Console.WriteLine(test.ToString()); // "Test here!"

为什么在前三种情况下我们有答案42,即使我们明确地转换为Test
implicit 运算符的优先级是否高于 ToString()

【问题讨论】:

  • 事实上,确实如此。您可以尝试在Language Specification的以下主题中找到原因:6.4.4 用户定义的隐式转换

标签: c# .net clr overloading operator-keyword


【解决方案1】:

是的。隐式运算符优先于显式运算符。语言规范规定隐式运算符不应丢失信息,而显式运算符则允许这样做。例如,参见MSDN explicit。如果您将关键字implicit 更改为explicit,您将看到Test here! 3 次,42 一次。

public class Test
{
    public static explicit operator int(Test t) { return 42; }
    public override string ToString() { return "Test here!"; }
}

var test = new Test();
Console.WriteLine(test); // "Test here!"
Console.WriteLine((Test)test); // "Test here!"
Console.WriteLine((int)test); // 42
Console.WriteLine(test.ToString()); // "Test here!"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2017-07-04
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多