1. ホーム
  2. c#

[解決済み] C#7: アンダースコア( _ )とスター( * )をOut変数に入れる

2023-05-04 04:52:51

質問

C#7 の新しい out variable 機能について読んでいました。 ここで . 私は2つの質問があります。

  1. と書かれています。

    アウトパラメータとして、"discards"も許可しています。 _ のような形で、アウト・パラメータとしての "discard"も許可しています。

    p.GetCoordinates(out var x, out _); // I only care about x
    
    

    Q: C#7.0以前でも可能なので、これは単なる情報であって、C#7の新機能ではないのでしょう。

    var _;
    if (Int.TryParse(str, out _))
    ...
    
    

    それとも、何か見落としているのでしょうか?

  2. 同じブログで紹介されているようにすると、私のコードはエラーになります。

    ~Person() => names.TryRemove(id, out *);
    
    

    * は有効な識別子ではありません。Mads Torgersenの見落としでしょうか?

どのように解決するのですか?

廃棄物 C#7では、変数が宣言されている場所であればどこでも、その名前が示すように、結果を破棄するために使用することができます。つまり、破棄はout変数で使用することができます。

p.GetCoordinates(out var x, out _);

であり、式の結果を破棄するために使われることがあります。

_ = 42;

例では

p.GetCoordinates(out var x, out _);
_ = 42;

変数はありません。 _ という変数が導入されているわけではありません。捨て札が使われるケースが2つあるだけです。

しかし、もし、識別子 _ がスコープ内に存在する場合は、ディスカードは使用できません。

var _ = 42;
_ = "hello"; // error - a string cannot explicitly convert from string to int

ただし、例外として _ 変数が out 変数として使われる場合です。この場合、コンパイラは型または var を無視し、廃棄として扱います。

if (p.GetCoordinates(out double x, out double _))
{
    _ = "hello"; // works fine.
    Console.WriteLine(_); // error: _ doesn't exist in this context.
}

の場合のみ発生することに注意してください。 out var _ または out double _ が使用されます。ただ、使用する out _ と書くと、既存の変数への参照として扱われます。 _ のように、スコープ内であれば、例えば

string _;
int.TryParse("1", out _); // complains _ is of the wrong type

最後に * という表記は、廃棄に関する議論の初期に提案されました。 が提案されましたが、放棄され、代わりに _ が他の言語ではより一般的な表記法であるため、採用されませんでした。 .