kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

特定の型パラメータの選択肢でジェネリックを制約する


何度となく思ったジェネリックの制限

where T : byte | char

って事で byte か char しか受けないよって事ですな。

こういう場合、private な内部クラスでジェネリッククラスを作っておいて、選択肢はパラメータオーバーロードで提供します。

 

    public static class Extentions
    {
        private class ArrayClearer<T> where T : struct
        {
            public static void ClearArray(T[] arr)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    arr[i] = default(T);
                }
            }
        }
        public static void ClearArray( char[] array )
        {
            ArrayClearer<char>.ClearArray(array);
        }
        public static void ClearArray( byte[] array )
        {
            ArrayClearer<byte>.ClearArray(array);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Extentions.ClearArray(new byte[]{});
            Extentions.ClearArray(new char[]{});
            Extentions.ClearArray(args);
            Extentions.ArrayClearer.ClearArray(args);
        }
    }

手間ばっかりなんでよっぽどの事でない限りこんな事する必要はないと思いますけど。

この例の最後の Extentions.ClearArray(args) は当然に string[] を受けるのが無いのでエラーに、ArrayClearerに直接触ろうとするのはprivateだから駄目と断られます。

きっちり制約したいという条件ではこんな書き方もできますよっと。

 

#でも制約で蹴った物が後から必要になったりすると直すのは手間だからご注意を

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。