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

実際、コンパイラは暗黙的にキャストFredstringますが、キーワードを使用して変数を宣言しているためvar、コンパイラは実際の意図を知りません。変数を文字列として宣言し、値を暗黙的に文字列にキャストすることができます。

string d = new Fred();

別の言い方をすれば、さまざまな型に対して多数の暗黙的な演算子を宣言した可能性があります。コンパイラがそれらのいずれかを選択できるとどのように期待しますか? コンパイラはデフォルトで実際の型を選択するため、キャストをまったく実行する必要はありません。

于 2009-05-13T20:04:34.937 に答える
1

あなたが欲しい

var b = new Fred();

fred 型であること、および

var c = new Fred();

文字列型にするには?宣言は同じなのに?

他のポスターで述べたように、新しい Fred() を宣言すると、それstring

于 2009-05-13T20:06:10.910 に答える
1

暗黙の演算子(あなたが持っている)を使用すると、次のように使用できるはずです:

 string d = new Fred(); 
于 2009-05-13T20:04:47.777 に答える
0

残念ながら、この例では、cFred 型です。Freds は文字列にキャストできますが、最終的には c は Fred です。d を強制的に文字列にするには、Fred を文字列としてキャストするように指示する必要があります。

本当に c を文字列にしたいのなら、単に文字列として宣言してみませんか?

于 2009-05-13T20:07:29.380 に答える