コンテンツへスキップ
ものがたり
戻る

thisは絶対にgenerics parameter typeではない

cscでも出ましたけど

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 したときに where T: Test は必ず失敗するのを思い立った。あれ、じゃあ? where T : interface とか where T : object としたら、コンパイル結果はかわるんだろうか?

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から考えて妥当だと思います。


この記事を共有:

前の記事
2005-09-18
次の記事