とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。

セッションネタです。


タイトルの通り、Visual Studio 2008 の Visual Basic コンパイラ は既存のコードに対する動作が Visual Studio 2005 から変更になっている部分があります。つまり、Visual Studio 2005 の Visual Basic で書かれたコードを Visual Studio 2008 でコンパイルした場合、異なる結果となる可能性があるということですね。

というわけで、ひょんなことからハマったりして凹む前にちょっと確認しておきましょう♪


1.ジェネリック パラメータと ParamArray パラメータを使用した場合の オーバーロードの解決動作が異なる。

さて、一つ目です。まずはコードから♪

Namespace Demo1
    Public Class Class1
        Public Overloads Sub Method(Of T)(ByVal a As T, ByVal ParamArray b() As Integer' ・・・ (1)
            System.Console.WriteLine("おぱおぱ~")
        End Sub
        Public Overloads Sub Method(Of Y)(ByVal a As Y, ByVal b As Y) ' ・・・ (2)
            System.Console.WriteLine("ばよばよ~")
        End Sub
    End Class
End Namespace

Demo1.Method はオーバーロードされていますね。どちらもジェネリック パラメータを持つジェネリック メソッドで、(1) のほうは2つ目の引数が ParamArray、(2) のほうはジェネリック型となっています。


では、以下のコードで Demo1.Method を呼び出した場合、実行されるのはどちらのオーバーロードでしょうか?

Namespace Demo1
    Module Program
        Sub Main()
            Dim c As New Class1             Dim i As Integer             Dim s As Short
            c.Method(i, s)
        End Sub
    End Module
End Namespace

実はこの呼び出しによって実行されるオーバーロードが Visual Studio 2008 と Visual Studio 2005 で異なります。

Visual Studio 2005 では (1) のメソッドが呼び出されます。これは、ジェネリックである Y に Integer 型と Short 型 の2つを指定することができず、s の型 である Short 型 は ParamArray である b へ拡張されるために起こります。

これに対して Visual Studio 2008 では (2) のメソッドが呼び出されます。これは Short 型が Integer 型に拡張されることによってジェネリックである Y は Integer 型 と推論されるためです。

投稿日時 : 2008年5月13日 0:30

Feedback

# re: Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。 2008/05/13 9:51 めたぼ なら

リテラル部分が
"おっぱいおっぱい"
"ぼよぼよ~ん"
に見えてしまった私は<del>いつもどーりです。</del>寝不足です。



てか、つまりそーゆーことぢゃろ。
(・o・)

# re: Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。 2008/05/13 9:53 めたぼ なら

C#編もきぼー
(・o・)/

# 調べがついてるのは調べがついてるのさのサー

# re: Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。 2008/05/13 11:32 Streetw☆

C#について調べたんですけど、次のエントリとかですか?
結果にはとてもビックリでした(前振りしときますねw)

でも普通はジェネリックの型に制限をかけると思うから、
ジェネリックじゃない方とたまたまどちらにも該当する
ような設計って少なそうな気がします。
たまたまじゃなくて意図的だとすると、
たいていはstring.Formatの第2引数みたいに
"object[] args"の高速版として"object args0"のオーバーロードを
用意する目的じゃないかなって思うから、
この変更は良いことかなって思いました。

# re: Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。 2008/05/13 13:46 めたぼ なら

> 結果にはとてもビックリでした(前振りしときますねw)
実験していないので、正解は知らないですが、C#であれば、コンパイルエラーであってほしいですね。
# そこら辺がC#のC#たるところだと思うので(なんのこっちゃ?)。

# re: Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。 2008/05/13 16:43 Streetw☆

>たまたまどちらにも該当する

あ!!、私勘違いしてました。
2005の方って、片方はエラーになるんですか!
かるぼさんのコメント見て、なぜエラー?っと思ってもう少し調べたら間違いに気付きましたorz

優先順位がかわるんじゃなくて、推論が賢くなったということでしょうか?

# re: Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。 2008/05/13 16:52 Streetw☆

>凹む前にちょっと確認しておきましょう♪

変なコメントしちゃって凹んでますorz

# Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その2。 2008/05/14 0:44 とりこらぼ。

Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その2。

# re: Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。 2008/05/15 12:48 とりこびと

コメントありがとうございます♪

>>めたぼさん

>つまりそーゆーことぢゃろ。

ちゃいます♪
おぱおぱ…知らないかw

C#版もやれそうならやりますよ♪


>>Streetw☆さん

当初はこの変更に対するC#での動作は思いつきませんでした。

というわけで、こっそり教えてくださいw

凹みながらwww

# それって、C#ではどうなんですか?(その1~その3) 2008/05/20 1:32 とりこらぼ。

それって、C#ではどうなんですか?(その1~その3)

# AUTKYtjfsMqXyslzJxD 2021/07/03 4:45 https://www.blogger.com/profile/060647091882378654

Really enjoyed this blog article.Really looking forward to read more. Great.

# re: Visual Studio 2008 ? Visual Basic ???? Visual Studio 2005 ?????????1? 2021/08/08 14:54 what is hydroxychloroquine used for arthritis

chlorquine https://chloroquineorigin.com/# hydroxychloroquine sulfate 200 mg tab

# Test, just a test 2022/12/13 7:49 Proops

canadian pharmacies ed pills https://www.candipharm.com/

タイトル  
名前  
Url
コメント