4
public struct MyInt
{
    public int csInt;

    public MyInt(int i)
    {
        csInt = i;
    }

    public MyInt(double d)
    {
        csInt = (int)d;
    }

    public static implicit operator MyInt(int value)
    {
        return new MyInt(value);
    }

    public static implicit operator MyInt(double value)
    {
        return new MyInt(value);
    }
}


int MyFunc(MyInt i = 0)
{
    return -1;
}

MyIntデフォルト値として受け入れるラッパー構造体(ここでは簡略化)を実装したいint(これは奇妙で不自然であることはわかっています。他の言語形式に準拠するために必要なだけです)が、上記のようにコーディングするとエラーが発生します。int MyFunc(MyInt i = 0)VS2012が言った場所:

Type MyInt への標準変換がないため、型 'int' の値を既定のパラメーターとして使用することはできません

私が知っているように、C# では int と double も struct として定義されています。だから私は次のことを試しました:

int MyFunc(double i = (int)0)
{
return -1;
}

合格しました!したがって、デフォルトのパラメーターでは型変換が許可されていると思います。

だから私の質問は:

  1. MyInt の暗黙的な型変換をデフォルトの para として使用できないのはなぜですか?
  2. VS エラー メッセージでの標準変換の意味は何ですか? MyInt で定義されている暗黙の変換とは異なりますか?
4

2 に答える 2

1

暗黙的なキャスト演算子はメソッドであり、メソッド (またはイベント静的フィールド) をデフォルトのパラメーターとして使用することはできません。定数のみが許可されます (コンパイラーは、メソッドを呼び出す場所でこれらの定数を実際に使用するため、これは理にかなっています)。

あなたの場合、構造体のデフォルト値(つまり、すべてのフィールドが 0 に初期化されている)が必要なので、次のdefaultキーワードを使用できます。

int MyFunc(MyInt i = default(MyInt))
{
    return -1;
}

C# の標準変換は、コンパイラが独自に実行できる変換です (Int32 から Double または任意の型から Object への変換など)。それらについては、 C# 仕様ですべて読むことができます。

于 2013-09-16T06:19:25.780 に答える