プロが教えるわが家の防犯対策術!

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() で、少なくとも数値型の暗黙の変換はしてくれるようなことにできないでしょうか。

よろしくお願いします。

A 回答 (3件)

#2です、少し補足します


#2>int i = a.getValue();
#2>のようには書けなくて
getValue()を 次のように書く場合(#2と同じ理屈)は、

public MyData getValue(){
return this;
}

i = a.getValue();

と書けます
    • good
    • 0
この回答へのお礼

確かにこれもできました。
戻り値の型を MyData としておくところがポイントなのですね。
補足ありがとうございました。

お礼日時:2005/08/12 03:05

今度 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 でも何でも対応できます。
    • good
    • 0
この回答へのお礼

そうなのですか。template みたいなものですね。
この場合、クラスのインスタンスを生成する時点で、そのクラスの T が決定しますよね。その後、同じクラスのインスタンスで T を変更することはできるのでしょうか。
どうもありがとうございました。

お礼日時:2005/08/13 01:11

このような場合、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;
のようになります。

でもまあ、こうした暗黙の変換というのは、ソースを読む上ではわかりにくくなりますから明示的にキャストするのがよろしいかと存じます。
    • good
    • 0
この回答へのお礼

早速試してみました。暗黙の変換が定義できるとは知りませんでした。
ご回答ありがとうございました。勉強したいと思います。

お礼日時:2005/08/12 03:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!