私は、コンパイラの動作を説明したいと思う状況があります。我々はFoo
クラスの署名に変更を加えた場合封印されたキーワードは、キャストに関するコンパイラの意見に影響します
static class FooGetterGetter
{
public static IFoo<T> Get<T>()
{
return (IFoo<T>)new FooGetter();
}
}
とsealed
キーワードを追加します:
interface IFoo<T>
{
T Get();
}
class FooGetter : IFoo<int>
{
public int Get()
{
return 42;
}
}
以下のコンパイルと実行:少しのコードを考えると
sealed class FooGetter : IFoo<int> // etc
を次に、次の行にコンパイラエラーが表示されます。
return (IFoo<T>)new FooGetter();
:
'MyNamespace.IFoo <T>' にタイプ 'MyNamespace.FooGetter' を変換できません
誰かがsealed
キーワードに関して、ここで何が起こっているのか説明できますか?これは、Visual Studioで.NET 4のプロジェクトに対して、2010年
C#4でアップデート:興味深いことにsealed
が適用されるときに、次のコードは、それを修正し、なぜ私が思っていたとき、私は行動のその部分につまずい:
return (IFoo<T>)(IFoo<int>)new FooGetter();
更新:ちょうど明確化のために要求されたT
のタイプが具体的な形で使用されるT
の型と同じであるとき、それはすべて正常に動作。種類が異なる場合は、キャストのようなもので、実行時に失敗します。
を入力するタイプ「MyNamespace.StringFoo」のオブジェクトをキャストすることができません「MyNamespace.IFoo`1 [可能System.Int32]」
上記の例では、StringFoo : IFoo<string>
で、発信者はint
を取得するように求めています。
私は答えを持っていないが、私はそれが 'IFooが' 'FooGetter'用具に対し、オープンジェネリック型であるという事実とは何かを持っていることを想像します'IFoo 'は閉じたジェネリック型です。 –
ちょっとメモ:私は質問を投稿する前に定義された振る舞いを持っていることを確かめました。自分自身をばかにすることを望まないのです:-)私はそれが許される理由を知ることができ、コンパイラは何が起こっているか保証できません。それは成功のチャンスがあることだけを知っている。しかし、なんらかの理由で、シールされたキーワードが存在するため、それが導き出せないので、Tと一致することができないと仮定して、同じ成功確率を取り除く。 –
+1興味深い: – leppie