2017-05-23 13 views
0

オブジェクトへの参照を格納して、その参照が参照解除されるとオブジェクトの値が更新されるようにする必要があります。簡単な例ではそうfuncref T代わりのTを返すべきであるオブジェクトへの参照を格納する

using System.Collections.Generic; 
namespace ABCD 
{ 
    public class ClassA<T>{ 
     T t; 
     public T func(T num){ 
      t = (T)(object)(2*(double)(object)num);//t has to be assigned in this method (not in func2) 
      T x = func2(); 
      t = (T)(object)(3*(double)(object)num);//t will be reassigned here, and I want this to be reflected in x 
      return x;//I want x to be 9 not 6 
     } 
     public T func2(){ 
      return t; 
     } 
    } 

    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      ClassA<double> a = new ClassA<double>(); 
      System.Console.WriteLine(a.func(3.0)); 
     } 
    } 
} 

ある、と私はa.func()の戻り値をDEREFだろうというときMain方法では、私が期待される答えを得ることができるだろう。これをC#でどうやって行うことができますか?

コードコメントに記載されている要件は変更できませんが、より良いソリューションがあればお勧めします。

答えて

0

あなたはそのようにそれを行うことができます。

using System; 

namespace ABCD 
{ 
    public class ClassA<T> 
    { 
     T t; 
     public T func(T num) 
     { 
      t = (T)(object)(2 * (double)(object)num);//t has to be assigned in this method (not in func2) 
      ref T x = ref func2(); 
      t = (T)(object)(3 * (double)(object)num);//t will be reassigned here, and I want this to be reflected in x 
      return x;//I want x to be 9 not 6 
     } 
     public ref T func2() 
     { 
      return ref t; 
     } 
    } 

    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      ClassA<double> a = new ClassA<double>(); 
      Console.WriteLine(a.func(3.0)); 
      Console.ReadLine(); 
     } 
    } 
} 

refキーワードはあなたがここで必要なものを正確に参照する、として何かをマークします。

refキーワードを使用するには、左側に追加する必要があります(コンパイラーが保存するリファレンスであることをコンパイラーが認識できるようにする必要があります)。右側に追加します(もちろん、参照への参照を割り当てる必要があります) (メソッドの型は参照として使用する必要があるため、後で参照として使用する必要があります)とreturn文(メソッドの型は参照でなければなりません。正しいタイプ)。参照は、単にrefキーワードを付けずに代入するだけで逆参照することができます。

+0

私はC#ではうまくいかず、あなたの例はコンパイルされません。 http://rextester.com/PNXRI65492ご確認ください。 –

+0

@ JaneDorothyこれはrextesterの問題だと思われます。もしあなたがLinqpadを使ってコンパイルすれば、それはうまくいきます。http://csharppad.com/gist/11e494cc65b43ad5fd90cb273c8e629c - 私はVSをとにかく使うことを勧めます。ショートコードテストではなく、実際のプログラミングでは使用できません。 – MetaColon

+0

もちろん、私はC#パッドに触れています。 – MetaColon

関連する問題