1. ホーム
  2. c#

[解決済み] return myVarとreturn (myVar)は違うのですか?

2023-04-01 13:10:07

質問

C#のサンプルコードを見ていて、ある例がreturnを()で囲んでいることに気づきました。

私はいつもそうしてきただけです。

return myRV;

している違いはあるのでしょうか。

return (myRV);

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

UPDATE: この質問は のブログの主題でした。 . 面白い質問をありがとうございました。

実際には、違いはありません。

理論上 には違いがあるかもしれません。C# の仕様には、この違いが生じる可能性のある興味深いポイントが 3 つあります。

まず、無名関数のデリゲート型と式木への変換です。次のように考えてみましょう。

Func<int> F1() { return ()=>1; }
Func<int> F2() { return (()=>1); }

F1 は明らかに合法です。これは F2 ? 技術的にはノーです。 仕様が からの変換があることを 6.5 節で述べています。 ラムダ式 から互換性のあるデリゲート型への変換があると書かれています。というのは ラムダ式 ? いいえ、これは 括弧で囲まれた式 を含んでおり ラムダ式 .

Visual C#コンパイラはここで小さな仕様違反を犯し、あなたの代わりに括弧を破棄してくれます。

2つ目です。

int M() { return 1; }
Func<int> F3() { return M; }
Func<int> F4() { return (M); }

F3 は合法です。は F4 ? いいえ。セクション 7.5.3 では、括弧で囲まれた式はメソッドグループを含んではいけないと述べています。ここでも便宜上、仕様に違反し、変換を許可しています。

3番目です。

enum E { None }
E F5() { return 0; }
E F6() { return (0); }

F5 は合法です。は F6 ? いいえ。仕様では、リテラルゼロから任意の列挙型への変換が存在するとされています。 (0) はリテラルゼロではなく、括弧の後にリテラルゼロが続き、さらに括弧が続いています。ここでは仕様に違反し、実際には任意の ゼロに等しいコンパイル時の定数式 であり、リテラル ゼロだけではありません。

つまり、どのような場合でも、技術的にはそうすることが違法であるにもかかわらず、それを逃れることを許可しているのです。