
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.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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
メインが含まれていません
-
式の型は配列型で int に解決済...
-
DataSet(DataTable)の使い方
-
JAVA エラー 式の開始が不正で...
-
西暦 -> 年号、年号 -> 西暦の...
-
java streamでenum配列への変換
-
行の途中から読み込む方法
-
classを使って座標軸を求めるコ...
-
java DAO 日付指定フォーマット...
-
オブジェクトの中のプロパティ...
-
ループ処理の際、最後だけ","を...
-
動的配列が存在(要素が有る)か...
-
System.err. printlnとSystem.o...
-
<forEach> 内で供給された "ite...
-
ORA-01858: 数値を指定する箇所...
-
0dの意味を教えてください
-
C言語のポインターに関する警告
-
IF関数でEmpty値を設定する方法。
-
VB.net 引数で配列変数を渡す際...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
メインが含まれていません
-
式の型は配列型で int に解決済...
-
javaでカレンダー作成
-
DataSet(DataTable)の使い方
-
Java 初心者 int型の取り扱い方
-
java初心者の質問(3つの整数の...
-
javaでcsvファイル読込時の改行...
-
Java 日付の加算がうまくいき...
-
JAVA エラー 式の開始が不正で...
-
6桁の数字を重複なしでランダム...
-
コンパイルできません
-
SwingでJtableのヘッダ行が表示...
-
C#で実行時にメソッドの返り値...
-
intが負の時に投げる例外はあり...
-
意味がわかりません
-
コンパイラが注意してくる
-
複数のボタンを配置し、それぞ...
-
Threadに関するの質問
-
C#でバブルソート
おすすめ情報