2017-05-10 2 views
3

C#7を習得しているうちに、の返信が返ってくるGetSingleメソッドは、私が学んだように動作します。しかし、GetInsメソッドは、コンパイル時エラーで私をスローします。 Unfortnately、私がいないワークアウトなぜ、どのようにこれらのGetInsできGetSingle異なります。誰かが私を説明できますか?C#7プロパティのRefリターンがコンパイルされない

エラー:この文脈では、参照として返されない可能性があるため、式は使用できません。

コメントの1つは、重複としてこれを提案していたことに注意してください。しかし、その質問はコレクションのタイプであり、これは具体的にはコレクションのメンバーとタイプのプロパティの間にありました。したがって、私は、これはShapeが財産エリアではなく公共のint型フィールドメンバを持っているため、この問題が発生した別の質問

class Pro 
    { 
     static void Main() 
     { 
      var x = GetSingle(new int[] { 1, 2 }); 
      Console.WriteLine(x); 
     } 
     static ref int GetSingle(int[] collection) 
     { 
      if (collection.Length > 0) return ref collection[0]; 
      throw new IndexOutOfRangeException("Collection Parameter!"); 
     } 
     static ref int GetIns(Shape s) 
     { 
      if (s.Area <= 0) 
      { 
       s.Area = 200; 
       return ref s.Area; 
      } 
      return ref s.Area; 
     } 
     struct Shape {public int Area{ get; set; } 
    } 
+1

あなたは、プロパティの 'ref'を取るこ​​とができません。 Shape.Areaはプロパティです。あなたはint.TryParse 'のように(' ref'/'out'パラメータを受け取るメソッド(「123」、s.Areaアウト)'にプロパティを渡すしようと同じことが起こります。 – xanatos

+1

[あなただけのレフリーを返すことができます「安全に戻る」:あなたに渡されたもの、およびオブジェクトのフィールドを指すもの。](https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in 。-csharp-7-0 /)だから、フィールドではなく、プロパティを返すことができ – DavidG

+0

@DavidG、ありがとう – Nair

答えて

4

としてご覧ください。 できませんプロパティへの参照を返します。

この文句を言わないコンパイル:

class Shape 
{ 
    private int mArea; 

    public int Area => mArea; 
} 

static ref int GetIns(Shape s) 
{ 
    if (s.Area <= 0) 
    { 
    s.Area = 200; 
    return ref s.Area; 
    } 
    return ref s.Area; 
} 

しかし、この意志を:

class Shape 
{ 
    public int Area; 
} 

static ref int GetIns(Shape s) 
{ 
    if (s.Area <= 0) 
    { 
    s.Area = 200; 
    return ref s.Area; 
    } 
    return ref s.Area; 
} 
+0

ドキュメントごとに真を保持します。しかし、最初に値型の参照型としてShapeを実装し直しました。必要な結果を得るためには、これを再実装することが必須ですか?同じことがstructによってどのように達成できるのか知っていますか? – Nair

関連する問題