0

我知道我可以对类使用隐式转换,如下所示,但是有什么方法可以让实例在没有强制转换或转换的情况下返回字符串?

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(); 
    }
}
4

4 回答 4

8

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

string d = new Fred();

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

于 2009-05-13T20:04:34.937 回答
1

使用隐式运算符(您拥有),您应该能够使用:

 string d = new Fred(); 
于 2009-05-13T20:04:47.777 回答
1

你要

var b = new Fred();

为 fred 类型,并且

var c = new Fred();

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

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

于 2009-05-13T20:06:10.910 回答
0

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

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

于 2009-05-13T20:07:29.380 回答