web-dev-qa-db-ja.com

C#7ローカル関数が期待どおりに動作せず、エラーが表示されない

フレームワークバージョン.NET 4.5で実行されているAsp.Net MVCアプリがあり、VS2017 proバージョンを使用しています。ユーザーは以下を含む添付ファイルをアップロードできますが、これらに限定されません。

  • エクセル
  • パワーポイント
  • pdf
  • jpeg
  • png

だから私は次のようなprivate関数を持っています:

_private string ImageExtension(string path)
{
  string noImagePath = HttpContext.Current.Server.MapPath("~/Content/images/Template/No-Image-Available-100x100.jpg");
  string fileExtension = System.IO.Path.GetExtension(path);
  switch (fileExtension)
  {
    case ".jpg":
    case ".jpeg":
    case ".gif":
    case ".png":
       return path;
    default:
       return noImagePath;
   }
}
_

ご覧のとおり、これは非常にシンプルで、特別なことは何もしていません。私はこれを1つの場所でのみ使用しているので、ローカル関数の新しいC#7機能を利用することを考えました。それで私は先に進み、次のように私のメイン関数を作成し、その中にImageExtension(string path)を追加しました。

_public void BugInfo(HttpPostedFileBase file)
{
  if(file != null && file.ContentLength > 0)
  {
    string fileName = file.FileName;
    string directoryPath = "directory path";

     //save path of 
     string savePath = System.IO.Path.Combine(directoryPath, fileName);
     string testString = ImageExtension(savePath);

     string ImageExtension(string path)
     {
        string noImagePath = HttpContext.Current.Server.MapPath("~/Content/images/Template/No-Image-Available-100x100.jpg");
        string fileExtension = System.IO.Path.GetExtension(path);
        switch (fileExtension)
        {
          case ".jpg":
          case ".jpeg":
          case ".gif":
          case ".png":
             return path;
          default:
             return noImagePath;
         }
      }
    }
  //save values to db here
 }
_

上記のコードを使用すると、プロジェクトはエラーなしでビルドされます。 _F5_または_Ctrl + F5_を押すとすぐに、次のエラー画面が表示されます

enter image description here

ErrorListをチェックインしてエラーがあるかどうかを確認すると、以下のようにまったくエラーが発生しません。

enter image description here

誰かがどこが間違っているのか教えてもらえますか? C#7の機能を使用するには、設定を変更する必要があるか、追加のDLLを含める必要がありますか?.

thisの回答を見ると、C#7のすべての機能が.NET 4.5で動作するはずです

38
Izzy

"Microsoft.Net.Compilers"という名前のnugetパッケージを最新バージョンに更新する必要があります。ほとんどの場合、プロジェクトにバージョン1.3.2がインストールされていますが、C#7の機能を使用するには2.0.1が必要です。別の方法として、このパッケージを(それに依存するパッケージと一緒に)まったく削除することもできます。インストールされているコンパイラーを使用するため、このパッケージも機能しますが、お勧めしません。

このパッケージの説明にあるように:

.Netコンパイラパッケージ。このパッケージを参照すると、システムにインストールされているバージョンではなく、パッケージに含まれているC#およびVisual Basicコンパイラの特定のバージョンを使用してプロジェクトがビルドされます。

これが、C#6コンパイラを使用する理由です。

48
Evk