C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 拡張メソッドでのNullable


(過去ログ 98 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■58517 / inTopicNo.1)  拡張メソッドでのNullable
  
□投稿者/ furu (23回)-(2011/04/12(Tue) 10:54:06)

分類:[C#] 

2011/04/12(Tue) 19:22:22 編集(投稿者)
c#4.0

拡張メソッドでNullable型を使用しているのですが
どうして以下のようになるのかわかりません。
仕様でしょうか?

    public static class AAA
    {
        public static string TTT(this int? BBB)
        {
            return "int?";
        }
        public static string TTT(this object BBB)
        {
            return "object";
        }
    }

    public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(666.TTT());
            MessageBox.Show(AAA.TTT(666));
        }
    }

    button1をくりっくすると
        "object"
        "int?"
    の順に表示され、同じ結果になりません。

もし、intが実引数の場合、int?が仮引数の拡張メソッドを探せないのであれば
objectが仮引数の拡張メソッドも探せないと思いますがいかがでしょうか?

よろしくお願いします。

引用返信 編集キー/
■58518 / inTopicNo.2)  Re[1]: 拡張メソッドでのNullable
□投稿者/ shu (617回)-(2011/04/12(Tue) 11:28:04)
No58517 (furu さん) に返信

int? = Nullable<int>はintのスーパークラスではないからではないかな?
引用返信 編集キー/
■58521 / inTopicNo.3)  Re[2]: 拡張メソッドでのNullable
□投稿者/ Hongliang (768回)-(2011/04/12(Tue) 12:07:32)
通常のメソッド呼び出しと拡張メソッドの呼び出しで、呼び出し候補を検索するときにに適用される条件は同じではありません。
拡張メソッドの場合、例えば数値の暗黙変換については考慮外です(long を引数に取るメソッドは int の拡張メソッドとして選択されない)。
同様にユーザー定義の暗黙の型変換も考慮外のため、Nullable<T> と T はこれに該当すると判断され対象外にされていると思われます。

ただ Nullable は C# では特別扱いされており、1 is int? が true を返すように作られているため、implicit identity conversion を満たしてるとも考えられるので、この動作が仕様に正しく合致しているかどうかは微妙なところですね。
引用返信 編集キー/
■58525 / inTopicNo.4)  Re[1]: 拡張メソッドでのNullable
□投稿者/ くり太郎 (15回)-(2011/04/12(Tue) 13:46:54)
くり太郎 さんの Web サイト
No58517 (furu さん) に返信

> 拡張メソッドでNullable型を使用しているのですが
> どうして以下のようになるのかわかりません。
> 仕様でしょうか?

これは面白い動きですね。

> もし、intが実引数の場合、int?が仮引数の拡張メソッドを探せないのであれば
> objectが仮引数の拡張メソッドも探せないと思いますがいかがでしょうか?

そうですよね。

Hongliang さんも仰っていますが、結果から判断すると「666 に対する型推論と、オーバーロードによるメソッドのシグニチャによる判断が異なるから」といった理由なんだと想像できますね。

引用返信 編集キー/
■58529 / inTopicNo.5)  Re[2]: 拡張メソッドでのNullable
□投稿者/ shu (619回)-(2011/04/12(Tue) 14:15:42)
object側のメソッドを削除すると
int用のメソッドが定義されていないよとエラーになりました。

やはり拡張メソッドについては継承関係だけで、呼び出し可能性まではみていないようです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -