【问题标题】:Class implicit conversions类隐式转换
【发布时间】:2009-05-13 20:03:37
【问题描述】:

我知道我可以对类使用隐式转换,如下所示,但是有什么方法可以让实例返回一个字符串而不进行强制转换或转换?

public class Fred
{
    public static implicit operator string(Fred fred)
    {
        return DateTime.Now.ToLongTimeString();
    }
}

public class Program
{
    static void Main(string[] args)
    {
        string a = new Fred();
        Console.WriteLine(a);

        // b is of type Fred. 
        var b = new Fred(); 

        // still works and now uses the conversion
        Console.WriteLine(b);    

        // c is of type string.
        // this is what I want but not what happens
        var c = new Fred(); 

        // don't want to have to cast it
        var d = (string)new Fred(); 
    }
}

【问题讨论】:

    标签: c# casting type-inference implicit-typing


    【解决方案1】:

    实际上,编译器会将Fred 隐式转换为string,但由于您使用var 关键字声明变量,编译器将不知道您的实际意图。您可以将变量声明为字符串,并将值隐式转换为字符串。

    string d = new Fred();
    

    换句话说,您可能已经为不同类型声明了十几个隐式运算符。您如何期望编译器能够在其中之一之间进行选择?编译器将默认选择实际类型,因此它根本不需要执行强制转换。

    【讨论】:

    • 是的,得到了​​这么多。希望没有强制转换或键入,我可以让 Fred() 返回一个字符串。可能是读得太多了。
    • 确实,强制转换是隐式完成的......您可以将new Fred() 传递给一个期望没有任何强制转换的字符串的方法。但是编译器并不能真正发挥作用并在没有任何线索的情况下推断出你的意图。
    • 对所有人来说,我认为我正在看我的问题的喜剧。谢谢
    • 别担心,这似乎是一个非常棘手的问题,直到你问别人,然后他们看着你,就像你疯了一样。
    【解决方案2】:

    使用隐式运算符(你有)你应该能够使用:

     string d = new Fred(); 
    

    【讨论】:

    • 是的,得到了​​这么多。希望没有演员或打字,我可以让 Fred() 返回一个字符串。
    【解决方案3】:

    你想要的

    var b = new Fred();

    属于fred类型,并且

    var c = new Fred();

    是字符串类型?即使声明相同?

    正如其他海报所提到的,当您声明一个新的 Fred() 时,它将是 Fred 类型,除非您给出 一些 指示它应该是 string

    【讨论】:

      【解决方案4】:

      不幸的是,在示例中,c 类型的 Fred。虽然 Freds 可以转换为字符串,但最终 c 是 Fred。要将 d 强制为字符串,您必须告诉它将 Fred 转换为字符串。

      如果你真的想让 c 成为一个字符串,为什么不把它声明为一个字符串呢?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多