週末に.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 %>");
Globalization
をSystem.Globalization
に置き換えると問題が解決しますが、Visual Studioは「名前を簡略化できる」ことを示唆しており、System
は不要であることを示しています。
問題の行にブレークポイントを設定すると、イミディエイトウィンドウから同じエラーが発生します。
Globalization.CultureInfo.CurrentUICulture
error BC30560: 'CultureInfo' is ambiguous in the namespace 'System.Globalization'.
私が正しく理解していれば、System.Globalization
とSystem.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; } + } +}
このエラーが実行時にのみ表示されるのはなぜですか?コンパイル時に失敗させるにはどうすればよいですか?
バグクラッシャーの答えは正しいです。回答に対するStijnのコメントに対処するには、プロジェクトで「グローバリゼーション」を検索します。そのすべてのインスタンスを削除します。意図しない副作用が発生する可能性があるため、検索+置換を使用してこれを行うことはありません。
次に、編集した各ファイルの正しいインポートまたはusingステートメントが上部にあることを確認します。
VB-インポートSystem.Globalization
C#-System.Globalizationを使用します。
それはVSが提案したであろう修正です。
「グローバリゼーション」を削除しました。 Visual Studioに修正を提案させます。ファイルに追加された「Import System.Globalization」を選択しました。
これでエラーが解消され、サイトは正常に機能します。