C# で、実行時にメソッドの返り値の型を変化させることは可能でしょうか?
たとえば、
public class MyData
{
object o;
public void setValue( object a )
{
o = a;
}
public object getValue()
{
return o;
}
}
というクラスがあるとき、
static void Main(string[] args)
{
MyData a = new MyData();
a.setValue( 3 );
Console.WriteLine( a.getValue().GetType().ToString() );
int i = (int)a.getValue();
}
というコードを実行すると、
System.Int32
と表示されます。Main の 4 行目で、(int)のキャストをはずすと、object から int への暗黙の変換はできませんというコンパイルエラーになります。
この(int)のキャストをしなくてもエラーにならないような getValue の関数はできないでしょうか? o は、数値型であるとします。
たとえば、MyData に、
public int getInt()
{
return (int)o;
}
とすれば、必ず int を返すようなメソッドはできると思うのですが、これだと、getByte() や、getDouble() などのように、考えられるすべての型を想定してメソッドを作ることになってしまいます。
そうではなく、getValue() で、少なくとも数値型の暗黙の変換はしてくれるようなことにできないでしょうか。
よろしくお願いします。
No.3
- 回答日時:
今度 11 月に出る C# の新バージョンでは Generics が使えるようになるので、とてもスマートな書き方ができるようになります。
public class MyData<T>
{
T o;
public void setValue( T a )
{
o = a;
}
public T getValue()
{
return o;
}
}
のように書いておけば、
MyData<int> a = new MyData<int>();
a.setValue( 3 );
int i = a.getValue();
のように書けます。int でも double でも string でも何でも対応できます。
そうなのですか。template みたいなものですね。
この場合、クラスのインスタンスを生成する時点で、そのクラスの T が決定しますよね。その後、同じクラスのインスタンスで T を変更することはできるのでしょうか。
どうもありがとうございました。
No.2ベストアンサー
- 回答日時:
#2です、少し補足します
#2>int i = a.getValue();
#2>のようには書けなくて
getValue()を 次のように書く場合(#2と同じ理屈)は、
public MyData getValue(){
return this;
}
…
i = a.getValue();
と書けます
No.1
- 回答日時:
このような場合、C#では、ユーザー定義の暗黙の変換を定義できます。
以下サンプル
------------------------------------------------------------------
using System;
using System.IO;
public class MyData{
object o;
public void setValue( object a ){
o = a;
}
public object getValue(){
return o;
}
public static implicit operator int(MyData d) {
return (int)d.o;
}
static void Main(string[] args){
MyData a = new MyData();
a.setValue( 3 );
Console.WriteLine( a.getValue().GetType().ToString() );
int i = a;
Console.WriteLine(i);
}
}
---------------------------------------------------------------
public static implicit operator int(MyData d) {
return (int)d.o;
}
の部分が暗黙の変換を定義している部分
こうしておくと
int i = a;
の様に、要求される型に応じて暗黙に変換されます。
ただ、変換要求される型をあらかじめ定義しておかなけれならないのはしょうがないことです。
数値型については、そもそも上位型への暗黙の変換があるので、全てが必要になるというわけではないと思います。
ちなみに、object型についてはこうしたユーザー定義の暗黙の変換演算子を定義することができません。(既に定義されているから)
なので、
int i = a.getValue();
のようには書けなくて
int i = a;
のようになります。
でもまあ、こうした暗黙の変換というのは、ソースを読む上ではわかりにくくなりますから明示的にキャストするのがよろしいかと存じます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
式の型は配列型で int に解決済...
-
javaのエラーの意味がわかりま...
-
Javaで素数の表を表示させたい...
-
java spring でエラーが出て困...
-
ある年月の月間日数を取得する...
-
分を表す数字(int型)を時間形...
-
Java3Dで円錐台を描く方法を教...
-
行の途中から読み込む方法
-
javaでカレンダー作成
-
javaでcsvファイル読込時の改行...
-
初心者ですが、今javaで簡単な...
-
(Swing)JTextFieldを半角のみ入...
-
C#で、デリゲートからその関数...
-
Javaでポインタ的なことはでき...
-
Javaのファイル名チェックについて
-
javaの課題・・
-
偶数奇数の判定
-
C#で「型または名前空間名 'int...
-
javaのRandomで『a~z』までの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
式の型は配列型で int に解決済...
-
「配列定数は、イニシャライザ...
-
javaでcsvファイル読込時の改行...
-
java spring でエラーが出て困...
-
javaでカレンダー作成
-
Javaで電卓を作りたい
-
SwingでJtableのヘッダ行が表示...
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
C#で実行時にメソッドの返り値...
-
(Swing)JTextFieldを半角のみ入...
-
c# デリゲート関連の命名について
-
Javaでポインタ的なことはでき...
-
複数のボタンを配置し、それぞ...
-
JUnit4のアノテーションについて
-
javaのエラーの意味がわかりま...
-
intが負の時に投げる例外はあり...
-
sin曲線とcos曲線を描くプログ...
-
C++からC#のdllを参照する際、...
-
Java 初心者 int型の取り扱い方
おすすめ情報