web-dev-qa-db-ja.com

.NET 4.6.2で導入されたSystem.Web.Globalization名前空間は、実行時にSystem.Globalizationと競合します。

週末に.NET Framework 4.6.2を含むWindows 10 Anniversary Updateをインストールした後、一部のコードが機能しなくなりました。 1週間前のバージョンに戻り、コードに関係がないことを確認しました。

実行時に、エラーがスローされます。

エラーBC30561:「グローバリゼーション」があいまいであり、名前空間またはタイプ「System.Web、System」からインポートされています。

スタックトレース:

System.Web.HttpCompileException (0x80004005): C:\path\to\project\MasterPages\SiteMaster.master(71): error BC30561: 'Globalization' is ambiguous, imported from the namespaces or types 'System.Web, System'.
   at System.Web.Compilation.BuildManager.PostProcessFoundBuildResult(BuildResult result, Boolean keyFromVPP, VirtualPath virtualPath)
   at System.Web.Compilation.BuildManager.GetBuildResultFromCacheInternal(String cacheKey, Boolean keyFromVPP, VirtualPath virtualPath, Int64 hashCode, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResult(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean ensureIsUpToDate)
   at System.Web.UI.BaseTemplateParser.GetReferencedType(VirtualPath virtualPath, Boolean allowNoCompile)
   at System.Web.UI.PageParser.ProcessMainDirectiveAttribute(String deviceName, String name, String value, IDictionary parseData)
   at System.Web.UI.TemplateParser.ProcessMainDirective(IDictionary mainDirective)

これは問題のある行です:

$.SetLanguage("<%= Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName %>");

GlobalizationSystem.Globalizationに置き換えると問題が解決しますが、Visual Studioは「名前を簡略化できる」ことを示唆しており、Systemは不要であることを示しています。

問題の行にブレークポイントを設定すると、イミディエイトウィンドウから同じエラーが発生します。

Globalization.CultureInfo.CurrentUICulture
error BC30560: 'CultureInfo' is ambiguous in the namespace 'System.Globalization'.

私が正しく理解していれば、System.GlobalizationSystem.Web.Globalizationの両方があります。 API diff によると、新しいネームスペースが導入されたため、この問題が発生しているようです。

+namespace System.Web.Globalization {
+    public interface IStringLocalizerProvider {
+        string GetLocalizedString(CultureInfo culture, string name, params object[] arguments);
+    }
+    public sealed class ResourceFileStringLocalizerProvider : IStringLocalizerProvider {
+        public const string ResourceFileName = "DataAnnotation.Localization";
+        public ResourceFileStringLocalizerProvider();
+        public string GetLocalizedString(CultureInfo culture, string name, params object[] arguments);
+    }
+    public static class StringLocalizerProviders {
+        public static IStringLocalizerProvider DataAnnotationStringLocalizerProvider { get; set; }
+    }
+}

このエラーが実行時にのみ表示されるのはなぜですか?コンパイル時に失敗させるにはどうすればよいですか?

14
user247702

バグクラッシャーの答えは正しいです。回答に対するStijnのコメントに対処するには、プロジェクトで「グローバリゼーション」を検索します。そのすべてのインスタンスを削除します。意図しない副作用が発生する可能性があるため、検索+置換を使用してこれを行うことはありません。

次に、編集した各ファイルの正しいインポートまたはusingステートメントが上部にあることを確認します。

VB-インポートSystem.Globalization

C#-System.Globalizationを使用します。

それはVSが提案したであろう修正です。

8
drewmerk

「グローバリゼーション」を削除しました。 Visual Studioに修正を提案させます。ファイルに追加された「Import System.Globalization」を選択しました。

これでエラーが解消され、サイトは正常に機能します。

3
Bug Crusher