質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

4回答

4517閲覧

ref,outとparamsの共存について

Arneco

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/05/10 07:50

編集2017/05/10 10:25

###前提・実現したいこと
お世話になります.
ある関数で「可変長引数」と「引数の参照渡し」を同時に実現しようとしています.しかし,out(及びref)とparamsを同時に書くことができません.
実現のため,他の解決策等ありましたら,ご教示頂ければと思います.
宜しくお願いします.

追記:引数に文字列のリストと複数の変数を入れると,変数にリストの値が順番に入るような処理を考えています.

###該当のソースコード

static void Main() { int a, b; string c; var strList = new List<string>(); strList = GetConsoleReader(); //入力文字列をリストに格納する関数 Input(strList, a, b, c); //a,b,cにstrList[0],[1],[2]を入れたい } public void Input(List<string> strList,**out params** Object[] inputData) //エラー箇所 { int count = 0; foreach (string str in strList) { if (inputData[count] is int) { inputData[count] = int.Parse(str); } if (inputData[count] is string) { inputData[count] = str; } count++; } }

###補足情報(言語/FW/ツール等のバージョンなど)
言語:C#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/05/10 07:55

何でそれをしたいのかがわかると他の解決策考えやすいです。
guest

回答4

0

public Object[] Method(params Object[] inputData) { // 何らかの処置 return inputData; }

ではダメな理由があるのでしょうか?

投稿2017/05/10 08:05

編集2017/05/10 08:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

原則やめた方が良いです。ですが、どうしてもやりたいんだ!止めてくれるなというなら、出来なくはないです。ただ、標準仕様外の隠しコマンドみたいなモノなのでまぁその辺はお察しください。

質問中にあるソースコードから具体的な要求がわからなかったので、そのまま機械的に書き換えてます。

csharp

1 2using System; 3using System.Collections.Generic; 4 5namespace ConsoleApp3 6{ 7 internal class Program 8 { 9 private static void Main(string[] args) 10 { 11 //未割り当てだと駄目だので、とりあえず初期化する。 12 var a = 0; 13 var b = 0; 14 string c = null; 15 16 var strList = new List<string> {"10", "11", "12"}; 17 18 Input(strList, __arglist(__makeref(a), __makeref(b), __makeref(c))); 19 20 //コンソールに出力。 21 Console.WriteLine(a); 22 Console.WriteLine(b); 23 Console.WriteLine(c); 24 } 25 26 //__arglistの部分がinputData相当 27 public static void Input(List<string> strList, __arglist) 28 { 29 var iterator = new ArgIterator(__arglist); 30 31 int count = 0; 32 33 while (iterator.GetRemainingCount() > 0) 34 { 35 TypedReference reference = iterator.GetNextArg(); 36 Type type = __reftype(reference); 37 38 //if(inputData[count] is int)と同じ処理 39 if (type == typeof(int)) 40 { 41 __refvalue(reference, int) = int.Parse(strList[count]); 42 } 43 //if (inputData[count] is string)と同じ処理 44 if (type == typeof(string)) 45 { 46 __refvalue(reference, string) = strList[count]; 47 } 48 49 50 count++; 51 } 52 } 53 } 54}

一応、コメント大体何やっているのか書いてあります。
また、この辺の子細に関しては、『++C++; // 未確認飛行;』中にある、型付き参照を参照なさってください。

投稿2017/05/21 14:38

編集2017/05/21 14:52
Tokeiya3

総合スコア260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

型厳密な言語を使う意味が薄れますが、dynamic を使うとか。

投稿2017/05/21 22:25

hidori

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

できません。
固定長ならタプルが使えますが、可変長は無理です。
そもそも可変長パラメータはすべて同じ型である必要があります。
配列やリストなどを使ってください。

投稿2017/05/10 07:58

編集2017/05/10 10:13
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問