次のコードでは、コンパイラ エラー CS0030 (VS 2012 の C# コンパイラでコンパイル) が発生しますが、キャストは実行時に成功する可能性があります。sealed
キーワードを削除するか、as
キャストを使用するか、中間キャストを追加するobject
と、エラーが解消されます。
public interface IFunny<out T> { }
public sealed class Funny<T> : IFunny<T>
{
public IFunny<TOther> Cast<TOther> ()
{
// error CS0030: Cannot convert type Funny<T>' to 'IFunny<TOther>'.
return (IFunny<TOther>) this;
}
}
コンパイラは、一般的なインターフェイスの実装の場合には厳しすぎる、封印されたクラスのみにヒューリスティックを使用しているようです。
(バグという意味で) 本当に厳しすぎるのでしょうか、それともこのエラーには正当な理由があるのでしょうか?
更新:私の質問に対する明確化:コンパイラは、コンパイル時にTOther
との間に関係があるかどうかを判断できません。が同じか、の基底クラスであるT
場合、実行時にキャストは成功し、それ以外の場合はすべて失敗します。これは封印されていてもいなくても同じです。TOther
T
Funny<T>
通常、C# コンパイラは、実行時に成功する可能性のあるキャストを防止しません。(たとえば、静的型のインスタンスを にキャストできobject
ます。インスタンスがそのインターフェイスを実際に実装していない場合、実行時例外が発生します。) この場合IComparable
、なぜそうするのですか?sealed