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

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

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

Re[11]: C#6.0 言語仕様


(過去ログ 130 を表示中)

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

■77000 / inTopicNo.1)  C#6.0 言語仕様
  
□投稿者/ furu (18回)-(2015/09/03(Thu) 19:40:59)

分類:[C#] 

そろそろC#6.0を使おうかなと思っています。

?.演算子もかなり興味がありますが
言語仕様が見つからなくて困っています。

どこにあるか教えてください。
引用返信 編集キー/
■77003 / inTopicNo.2)  Re[1]: C#6.0 言語仕様
□投稿者/ ぶなっぷ (45回)-(2015/09/04(Fri) 08:49:00)
?って三項演算子のこと?

だとしたら、C#6.0どころか、C++どころか、C言語の頃からあるよ。

引用返信 編集キー/
■77004 / inTopicNo.3)  Re[2]: C#6.0 言語仕様
□投稿者/ Hongliang (341回)-(2015/09/04(Fri) 09:03:36)
> ?って三項演算子のこと?
>
> だとしたら、C#6.0どころか、C++どころか、C言語の頃からあるよ。
null条件演算子です。?の後ろにメンバアクセス演算子のドットが付いています。
http://ufcpp.net/study/csharp/ap_ver6.html#null-conditional

本題ですが、今のところ言語仕様はまとまったドキュメントとしては存在していないみたいですね。
VS2015に付いているのもC#5.0のものらしいですし。
言語仕様ではなくリファレンスとしては用意されているようです。
https://msdn.microsoft.com/ja-jp/library/618ayhy6.aspx
(言語のすべてがフォローされているかどうかは未確認ですが、null条件演算子などが記述されているのは見かけました)

C#5.0からの変更点について知りたい程度であれば、最初に挙げたページなどを参考にすれば良いかと思います。
引用返信 編集キー/
■77007 / inTopicNo.4)  Re[3]: C#6.0 言語仕様
□投稿者/ ぶなっぷ (46回)-(2015/09/04(Fri) 09:53:21)
なるほど、nullを返す可能性のあるメンバの後ろに?をつけて、戻り値も?つきにすれば
良いというわけですね。
便利そうです。

引用返信 編集キー/
■77024 / inTopicNo.5)  Re[3]: C#6.0 言語仕様
□投稿者/ furu (20回)-(2015/09/04(Fri) 22:30:44)
No77004 (Hongliang さん) に返信
> 本題ですが、今のところ言語仕様はまとまったドキュメントとしては存在していないみたいですね。
> VS2015に付いているのもC#5.0のものらしいですし。
> 言語仕様ではなくリファレンスとしては用意されているようです。
> https://msdn.microsoft.com/ja-jp/library/618ayhy6.aspx

やはり、言語仕様はないんですね。
肝心なところは仕様を見ないと気がすまないんで残念です。
みなさんは、こんなことできるとかできないとか
試行錯誤でプログラミングいるのしょうか?

リファレンスではnull条件演算子は
「x?.y 左側のオペランドが null の場合に null を返します。」と書かれていますが
これだと

var d = a?.b.c;
↓↓↓
var d = (a?.b).c;
↓↓↓
var ab = a?.b;
var d = ab.c;

が成り立ってしまうように思えます。
(c#6.0で試していないので実際にはわからないです)

null条件演算子を言語仕様ではどう記述するか見たいです。

引用返信 編集キー/
■77036 / inTopicNo.6)  Re[4]: C#6.0 言語仕様
□投稿者/ shu (774回)-(2015/09/07(Mon) 07:45:08)
No77024 (furu さん) に返信
>
> var d = a?.b.c;
> ↓↓↓
> var d = (a?.b).c;
> ↓↓↓
> var ab = a?.b;
> var d = ab.c;
>
> が成り立ってしまうように思えます。
> (c#6.0で試していないので実際にはわからないです)
>
計算順序からそのようになるのは普通かと思います。
ただ
a?.b.c
だと
a?.b が null
だと例外になるので
a?.b?.c
となっていくかと思います。


引用返信 編集キー/
■77038 / inTopicNo.7)  Re[5]: C#6.0 言語仕様
□投稿者/ なちゃ (78回)-(2015/09/07(Mon) 09:15:16)
> 計算順序からそのようになるのは普通かと思います。
> ただ
> a?.b.c
> だと
> a?.b が null
> だと例外になるので
> a?.b?.c
> となっていくかと思います。

最初の?時点でnullだった場合そこで評価が止まるのか、nullを返した上で評価が続くのかという話で、もしトマルバアイハ変わってくるという話しでしょう。
で実際止まるのか続くのかは私もよく知りません。
引用返信 編集キー/
■77039 / inTopicNo.8)  Re[6]: C#6.0 言語仕様
□投稿者/ (こ) (1回)-(2015/09/07(Mon) 10:01:42)
No77038 (なちゃ さん) に返信
> 最初の?時点でnullだった場合そこで評価が止まるのか、nullを返した上で評価が続くのかという話で、もしトマルバアイハ変わってくるという話しでしょう。
> で実際止まるのか続くのかは私もよく知りません。

https://msdn.microsoft.com/en-us/library/dn986595.aspx
> int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null
...
> The last example demonstrates that the null-condition operators are short-circuiting.
> If one operation in a chain of conditional member access and index operation returns null,
>  then the rest of the chain’s execution stops.

止まります。

引用返信 編集キー/
■77049 / inTopicNo.9)  Re[7]: C#6.0 言語仕様
□投稿者/ なちゃ (79回)-(2015/09/07(Mon) 15:47:13)
No77039 ((こ) さん) に返信
>>The last example demonstrates that the null-condition operators are short-circuiting.
>>If one operation in a chain of conditional member access and index operation returns null,
>> then the rest of the chain’s execution stops.
>
> 止まります。

ありがとうございます。
考えてみればそりゃそうですね。
評価を続けても実質意味がなく不合理なだけですね。
引用返信 編集キー/
■77057 / inTopicNo.10)  Re[7]: C#6.0 言語仕様
□投稿者/ furu (21回)-(2015/09/08(Tue) 11:32:25)
No77039 ((こ) さん) に返信
> https://msdn.microsoft.com/en-us/library/dn986595.aspx
>>int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null
> ...
>>The last example demonstrates that the null-condition operators are short-circuiting.
>>If one operation in a chain of conditional member access and index operation returns null,
>> then the rest of the chain’s execution stops.
> 
> 止まります。

ショートサーキットなのでしょうが、&&演算子などと全然ちがいますよね。
&&演算子は、「必要な場合のみ、2 番目のオペランドが評価されます。」と書かれていて
残り全部ではありません。

    a && b && c      //(1)
    (a && b) && c    //(2)

    a ?. b . c      //(3)
    (a ?. b) . c    //(4)

(1)と(2)は同じですが
(3)と(4)は同じではありません。

普通の演算子ではないようないので
言語仕様ではどう辻褄を合わせたのか見てみたいです。

引用返信 編集キー/
■77058 / inTopicNo.11)  Re[8]: C#6.0 言語仕様
□投稿者/ Hongliang (343回)-(2015/09/08(Tue) 12:06:38)
> a ?. b . c //(3)
> (a ?. b) . c //(4)

そもそも . はショートサーキットではないのですが。
// なお、同じILを出力し、どちらもNullReferenceExceptionになります。
引用返信 編集キー/
■77060 / inTopicNo.12)  Re[9]: C#6.0 言語仕様
□投稿者/ furu (22回)-(2015/09/08(Tue) 12:56:39)
No77058 (Hongliang さん) に返信
>>    a ?. b . c      //(3)
>>    (a ?. b) . c    //(4)
> 
> そもそも . はショートサーキットではないのですが。

英語で「short-circuiting」と書かれています。
. はショートサーキットではありませんが
?. はショートサーキットなのではないですか?

> // なお、同じILを出力し、どちらもNullReferenceExceptionになります。

C#6.0をインストールしてないのでわからなかったのですが
腑に落ちないので他の人に試してもらいました。

            string s = null;

            var x = s?.ToString().ToString();           //(5)
            var y = (s?.ToString()).ToString();          //(6)

(5)はxにnullになり、
(6)はNullReferenceExceptionになりました。

ILは見方がわからないのですが、同じILではないと思います。

引用返信 編集キー/
■77061 / inTopicNo.13)  Re[10]: C#6.0 言語仕様
□投稿者/ Hongliang (344回)-(2015/09/08(Tue) 13:39:12)
> (5)はxにnullになり、
> (6)はNullReferenceExceptionになりました。

失礼しました、確かにそうですね。
これは、多分この一文でフォローされている点でしょう。

> Other operations with lower precedence in the expression continue.

()によって演算子の優先順位が変わってしまったので、式評価が継続すると。
引用返信 編集キー/
■77103 / inTopicNo.14)  Re[11]: C#6.0 言語仕様
□投稿者/ furu (24回)-(2015/09/11(Fri) 21:28:47)
No77061 (Hongliang さん) に返信
>> Other operations with lower precedence in the expression continue.
> 
> ()によって演算子の優先順位が変わってしまったので、式評価が継続すると。

演算子の実行順序は変わっていないので、
演算子の影響範囲というのがあり、それが変わったと思えばいいのかな。

こんな書き方もできるから不思議です。

    var a = x?    [5]?     [7];
    var b = x?    .y();
    var c = x&    &y;   //エラー
    var d = --x;       //--演算子
    var e = -     -x;  //-演算子

?.演算子や?[演算子ではなく、
.演算子や[演算子の前における?演算子なのかな。

シンタックスシュガーなんでしょうけど、
見た目わかりづらいですね。

誰かが書いた
   aaaa?.bbbb().cccc().d1();
   aaaa?.bbbb().cccc().d2();
   aaaa?.bbbb().cccc().d3();
   aaaa?.bbbb().cccc().d4();
を
   var abc = aaaa?.bbbb().cccc();
   abc.d1();
   abc.d2();
   abc.d3();
   abc.d4();
にしてしまいそう。

すみません。話がそれてしまいました。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -