タイトルの通りです。備忘録としての投稿です。
1 2 3 4 5 6 7 8 9 |
ref T ForceToByValue<T>(T source) { T destination = default(T); if (source is System.ICloneable cloneableSource) { destination = (T)(cloneableSource.Clone()); } else { destination = source; } return ref (new T[1] { destination })[0]; } |
利用イメージ
1 2 3 4 5 6 7 8 9 |
static int Property { get => 1; } static void Main(string[] args) { var valueInt32 = 123; var valueString = "123"; RefFunc(ref ForceToByValue(1)); RefFunc(ref ForceToByValue(Property)); RefFunc(ref ForceToByValue(valueInt32)); RefFunc(ref ForceToByValue(valueString)); } |
VB6のByRef引数において、「()」で囲い、値渡しを強制する方法をC#再現にも利用可能です。
C#における関連エラーコードは下記です。
・CS0206: A non ref-returning property or indexer may not be used as an out or ref value
・CS1510: A ref or out value must be an assignable variable
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/ref-modifiers-errors#reference-variables-require-a-referent
参考になったサイトは下記です。
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs8157