DOBON.NETプログラミング道掲示板

24時間以内に投稿された新着記事


■35448 / )  Re[6]: jumbo icon(256x256)が存在するか知る方法
□投稿者/ inunoshi 一般人(6回)-(2023/06/06(Tue) 20:49:58)
  • アイコン本来の質問以外のところで文法の手ほどきまでしていただきありがとうございます。

    > それは LINQ の問題では無いですね。
    > エラー行とエラー列を再度確認してみてください。
    >
    > .FirstOrDefault(〜) が失敗しているのではなく、
    > その後に続く ?.Icon の部分を解釈できていないのだと思います。
    >
    >
    > ?.Icon 構文は「null 条件演算子」といって C#6 で追加された文法です。
    > csc.exe のオプションに /langversion:6 を追加してみてください。
    > https://ufcpp.net/study/csharp/ap_ver6.html#null-conditional
    > 現状は恐らく、
    >  C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
    >  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
    > を使っているのだと思いますが、これらは /langversion:5 までしか理解しませんので、
    > Roslyn 世代の csc.exe を利用してください。

    はい。
    csc.exeを以下のように使ってコンパイルしました。
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /nologo /t:exe icon256.cs /r:iconlib.dll
    諸事情により、Windows標準のコンパイラを使いたいのでC#5の仕様までで行きたいと思っています。
    ただ、自分ではC#6以上の文法で出たコンパイルエラーを理解するのはスキル不足でした。

    Roslynは初めて知ったので、検索等して自分で勉強してみます。
    手元の環境はVSCode+.NET7.0で開発。最終コンパイルはWin11標準のcsc.exe使用です。

    > なお、
    >  var icon = singleIcon.FirstOrDefault(x => x.Size == size)?.Icon;
    > という行を
    >  var iconImage = singleIcon.FirstOrDefault(x => x.Size == size);
    >  if (iconImage == null) { continue; }
    >  var icon = iconImage.Icon;
    >  if (icon == null) { continue; }
    > に書き換えれば、文法レベルを C#3 相当まで下げることができます。

    C#3相当に書き直していただいたコードまで作ってくださりありがとうございます。
    いただいた内容そのままですが、以下のコードで、Win11標準のcsc.exeでもコンパイルできました。

    ありがとうございました。
    本来の質問以外のところでも大変勉強になりました。

    --------------------------------------------------------------------------
    using System;
    using System.Linq;

    public class Icon256
    {
      public static void Main()
      {
        string iconFilePath = @"C:\Windows\notepad.exe";

        var size = new System.Drawing.Size(256, 256);
        var multiIcon = new System.Drawing.IconLib.MultiIcon();
        multiIcon.Load(iconFilePath);
        foreach (var singleIcon in multiIcon)
        {
          //var icon = singleIcon.FirstOrDefault(x => x.Size == size)?.Icon;
          var iconImage = singleIcon.FirstOrDefault(x => x.Size == size);
          if (iconImage == null) { continue; }
          var icon = iconImage.Icon;
          if (icon == null) { continue; }
     
          if (icon != null)
          {
            string outName = string.Format(@"D:\{0}_256_{1}.ico",
              System.IO.Path.GetFileNameWithoutExtension(iconFilePath),
              singleIcon.Name
            );
            using (icon)
            using (var sm = new System.IO.FileInfo(outName).Create())
            {
              icon.Save(sm);
            }
          }
        }
      }
    }

解決み!
違反を報告
返信 削除キー/

■35447 / )  Re[5]: jumbo icon(256x256)が存在するか知る方法
□投稿者/ 魔界の仮面弁士 大御所(1551回)-(2023/06/06(Tue) 09:42:21)
  • アイコン
    No35446に返信(inunoshiさんの記事)
    > csc.exeでのコンパイル時のエラー(FirstOrDefaultの行で出ます)
    >  error CS1525: '.' は無効です。
    >  error CS1003: 構文エラーです。':' が必要です。
    
    それは LINQ の問題では無いですね。
    エラー行とエラー列を再度確認してみてください。
    
    .FirstOrDefault(〜) が失敗しているのではなく、
    その後に続く ?.Icon の部分を解釈できていないのだと思います。
    
    
    ?.Icon 構文は「null 条件演算子」といって C#6 で追加された文法です。
    csc.exe のオプションに /langversion:6 を追加してみてください。
    https://ufcpp.net/study/csharp/ap_ver6.html#null-conditional
    
    
    現状は恐らく、
     C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
     C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
    を使っているのだと思いますが、これらは /langversion:5 までしか理解しませんので、
    Roslyn 世代の csc.exe を利用してください。
    
    なお、C# 6 以降に対応したコンパイラで /langversion:5 を指定した場合は、
      error CS1525: '.' は無効です。
      error CS1003: 構文エラーです。':' が必要です。
    ではなく、
      error CS8026: 機能 'Null を反映する演算子' は C# 5 では使用できません。6 以上の言語バージョンをお 使いください。
    というメッセージに変化するはずです。
    
    
    なお、
     var icon = singleIcon.FirstOrDefault(x => x.Size == size)?.Icon;
    という行を
     var iconImage = singleIcon.FirstOrDefault(x => x.Size == size);
     if (iconImage == null) { continue; }
     var icon = iconImage.Icon;
     if (icon == null) { continue; }
    に書き換えれば、文法レベルを C#3 相当まで下げることができます。

解決み!
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -

2023/06/07(Wed) 09:10:27 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする