次の方法で共有


<TimeSpan_LegacyFormatMode> 要素

System.TimeSpan 値を使用した書式設定操作で、ランタイムが従来の動作を維持するかどうかを決定します。

configuration
  runtime
    <TimeSpan_LegacyFormatMode>

構文

<TimeSpan_LegacyFormatMode
   enabled="true|false"/>

属性および要素

以降のセクションでは、属性、子要素、および親要素について説明します。

属性

属性 説明
enabled 必須の属性です。

ランタイムで System.TimeSpan 値に従来の書式設定動作を使用するかどうかを指定します。

enabled 属性

[値] 説明
false ランタイムでは、従来の書式設定動作は復元されません。
true ランタイムでは、従来の書式設定動作が復元されます。

子要素

なし。

親要素

要素 説明
configuration 共通言語ランタイムおよび .NET Framework アプリケーションで使用されるすべての構成ファイルのルート要素です。
runtime ランタイム初期化オプションに関する情報を含んでいます。

解説

.NET Framework 4 以降では、System.TimeSpan 構造体は IFormattable インターフェイスを実装し、標準およびカスタムの書式指定文字列を使用した書式設定操作をサポートします。 解析メソッドでサポートされていない書式指定子または書式指定文字列が検出されると、FormatException がスローされます。

以前のバージョンの .NET Framework では、TimeSpan 構造体では IFormattable が実装されておらず、書式指定文字列をサポートしていませんでした。 しかし、多くの開発者は、TimeSpan が一連の書式指定文字列をサポートしていると思い込み、String.Format などのメソッドを使用して複合書式指定操作で使用していました。 通常、型で IFormattable が実装され、書式指定文字列をサポートしている場合、サポートされていない書式指定文字列を使用した書式設定メソッドの呼び出しでは FormatException がスローされます。 しかしながら、TimeSpan では IFormattable が実装されていないため、ランタイムでは書式指定文字列が無視され、代わりに TimeSpan.ToString() メソッドが呼び出されました。 つまり、書式指定文字列は書式設定操作に影響を与えませんが、その結果は FormatException にはなりませんでした。

レガシ コードによって複合書式設定メソッドと無効な書式指定文字列が渡され、そのコードを再コンパイルできない場合は、<TimeSpan_LegacyFormatMode> 要素を使用して従来の TimeSpan の動作を復元できます。 この要素の enabled 属性を true に設定すると、複合書式設定メソッドでは TimeSpan.ToString(String, IFormatProvider) の代わりに TimeSpan.ToString() が呼び出され、FormatException はスローされません。

次の例では、TimeSpan オブジェクトをインスタンス化し、サポートされていない標準書式指定文字列を使用して、String.Format(String, Object) メソッドによる書式設定を試みます。

using System;

public class Example
{
   public static void Main()
   {
      TimeSpan interval = new TimeSpan(12, 30, 45);
      string output;
      try {
         output = String.Format("{0:r}", interval);
      }
      catch (FormatException) {
         output = "Invalid Format";
      }
      Console.WriteLine(output);
   }
}
Module Example
    Public Sub Main()
        Dim interval As New TimeSpan(12, 30, 45)
        Dim output As String
        Try
            output = String.Format("{0:r}", interval)
        Catch e As FormatException
            output = "Invalid Format"
        End Try
        Console.WriteLine(output)
    End Sub
End Module

.NET Framework 3.5 またはそれ以前のバージョンで例を実行すると、次のように出力されます。

12:30:45

これは、.NET Framework 4 以降のバージョンで例を実行した場合の次の出力とは大きく異なります。

Invalid Format

ただし、例のディレクトリに次の構成ファイルを追加し、.NET Framework 4 以降のバージョンで例を実行すると、.NET Framework 3.5 で例を実行した場合と同じ出力が生成されます。

<?xml version ="1.0"?>
<configuration>
   <runtime>
      <TimeSpan_LegacyFormatMode enabled="true"/>
   </runtime>
</configuration>

関連項目