VB6

using System;
using System.Globalization;

namespace VB6
{
    /// <summary>
    /// VB6 の CStr 関数を C# に移植した互換関数です。
    /// </summary>
    public static class Functions
    {
        /// <summary>
        /// VB6 の CStr と同じ規則で任意の値を文字列に変換します。
        /// </summary>
        /// <param name="value">文字列に変換する値。</param>
        /// <returns>
        /// VB6 の CStr と同じ変換結果。
        /// null や DBNull の場合は空文字列。
        /// 数値は桁区切りなしでカルチャ依存の書式。
        /// 日付は現在カルチャに従った文字列。
        /// Boolean は "True" または "False"。
        /// </returns>
        /// <remarks>
        /// このメソッドは VB6 → C# 自動変換を前提として設計されています。
        /// VB6 の暗黙の文字列変換の動作を再現するため、通常の .NET の 
        /// <see cref="Convert.ToString(object)"/> とは一部異なる挙動になります。
        /// </remarks>
        public static string CStr(object value)
        {
            if (value == null || value is DBNull) 
                return string.Empty;

            switch (Type.GetTypeCode(value.GetType()))
            {
                case TypeCode.String:
                    return (string)value;

                case TypeCode.Boolean:
                    return (bool)value ? "True" : "False";

                case TypeCode.Char:
                    return value.ToString();

                case TypeCode.SByte:
                case TypeCode.Byte:
                case TypeCode.Int16:
                case TypeCode.Int32:
                case TypeCode.Int64:
                case TypeCode.UInt16:
                case TypeCode.UInt32:
                case TypeCode.UInt64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    // VB6のCStrは数値に桁区切りを付けない
                    return Convert.ToString(value, CultureInfo.CurrentCulture);

                case TypeCode.DateTime:
                    return ((DateTime)value).ToString(CultureInfo.CurrentCulture);

                default:
                    return value.ToString();
            }
        }
    }
}