C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 42 を表示中)
■21931 / )  Re[3]: ジェネリクスにおけるinterfaceの暗黙な型変換
□投稿者/ KAZUu (2回)-(2008/07/11(Fri) 22:28:53)
2008/07/11(Fri) 22:43:44 編集(投稿者)
Hongliang さん、NyaRuRu さん返信ありがとうございます。

> CS0552 が直接の原因ですね。
> インターフェイスを相手にしたユーザー定義の型変換は許可されていません。

なるほど、やはり言語仕様的に許されていないのですね。
勉強になりました。

> 用途が分からないのでうまくいくかどうか分かりませんが,
> 考えられる代替案のひとつは,T が interface 型であることを隠してしまうことですかね. 

残念ながら用途には合わないのですが、こういった逃げ方もあるのですね。
面白いなぁと思いました。

一応、用途を説明しますと、
先行評価も遅延評価も一緒くたに扱えるインタフェースが欲しいと思いまして、

public interface IWrap<T>
{
	T Value { get; }
}

public abstract class Wrap<T> : IWrap<T>
{
	public abstract T Value { get; }

	public static implicit operator Wrap<T>(T value)
	{
		return new ConcreteWrap<T>(value);
	}
	...
}

public class ConcreteWrap<T> : Wrap<T>
{
	private T _value;
	public override T Value { get { return _value; } }
	...
}

public class LazyWrap<T> : Wrap<T>
...

といったようなクラスを作り、
T から ConcreteWrap<T> にシームレスな変換を実現したかったためです。
ですが、どうやらインタフェースに対しては暗黙な型変換ができないようなので我慢します。

ただ、new ConcreteWrap<int>(0) よりは Make.ConcreteWrap(0) のほうが楽なので、
NyaRuRu さんの案を活用してみたいと思います。

皆様どうもありがとうございました。

解決済み
返信 編集キー/


管理者用

- Child Tree -