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 さんの案を活用してみたいと思います。
皆様どうもありがとうございました。