using System.Collections.Generic;
class Test
{
public IEnumerable Foo (IEnumerator e)
{
List l = new List ();
if (this is T)
l.Add ((T) this);
return l;
}
}
generic-t.cs(9,11): error CS0030: Cannot convert type ‘Test’ to ‘T’
ですって。
追記: 9行目にあるのはisではなくてexplicit conversionじゃん…以下リンク先参照。
そんなわけで面倒になったんで一時中断。まあ、XOMだし。
コメント
ladybug — 09/18/2005 17:51:40
reopen はしないんです?
atsushieno — 09/18/2005 18:40:37
おっと忘れてた。サンクスです。
ladybug — 09/18/2005 19:48:13
こっちでやっちゃおうかとも思ったんですけどね(苦笑
パラメータ e の役割がよくわからないのと検証環境がないのですが、(workaroundのほうは別にして)where T: test はありえない解だと思うし、T が Open Type であるにもかかわらず e is T の e によって挙動が違うのは変なきがする。
atsushieno — 09/19/2005 00:03:03
そーなんすよ。object型の変数だったら通るわけですしね。僕は最初thisの型は決まってるから拒否られてるんじゃん?とか言って仕様だと思っていたんですが、それはおかしいだろ、とmonoハカーに指摘されちゃいました。
ladybug — 09/19/2005 20:02:18
where T : Test と書いた場合、this is T は必ず成立するという警告を出すってのなら納得する(笑
ladybug — 09/19/2005 20:04:29
↑とか書いて、投稿ボタンの読み込みが終わるよりはやく class T1 : Test に対して Foo
atsushieno — 09/19/2005 23:44:59
仕様を読まずにサクッと試すだけ試してみましたが、objectは特別に error CS0702: Constraint cannot be special class ’object’ とかいってはねられますね。インターフェースでは変わらないようです。
いずれにしろ、本件に限定した話で言えば、これらで違いが出たとしても、単なるC# 2.1コンパイラ実装の詳細ということになりますね。
ladybug — 09/20/2005 12:59:18
まともそうな解答で Closed になりました? isinst じゃなくて castclass と。
atsushieno — 09/20/2005 13:21:33
ぅぉ、ホントだorz TestからTへのexplicit conversionは遍在しないので、C# 2.1のセクション14.6.6から考えて妥当だと思います。