1

シングルトンベースクラスの記事からいくつかのコードを試しています。しかし、コンパイルすると、そのエラーメッセージが表示されます。プロジェクトのターゲットフレームワークが4.0クライアントフレームワークではなく、4.0フルであることを確認しました。コードの何が問題になっていますか?

コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Reflection;

namespace ConsoleApplication1
{
    public abstract class SingletonBase<t> where T : class
    {
        /// <summary>
        /// A protected constructor which is accessible only to the sub classes.
        /// </summary>
        protected SingletonBase() { }

        /// <summary>
        /// Gets the singleton instance of this class.
        /// </summary>
        public static T Instance
        {
            get { return SingletonFactory.Instance; }
        }

        /// <summary>
        /// The singleton class factory to create the singleton instance.
        /// </summary>
        class SingletonFactory
        {
            // Explicit static constructor to tell C# compiler
            // not to mark type as beforefieldinit
            static SingletonFactory() { }

            // Prevent the compiler from generating a default constructor.
            SingletonFactory() { }

            internal static readonly T Instance = GetInstance();

            static T GetInstance()
            {
                var theType = typeof(T);

                T inst;

                try
                {
                    inst = (T)theType
                      .InvokeMember(theType.Name,
                        BindingFlags.CreateInstance | BindingFlags.Instance
                        | BindingFlags.NonPublic,
                        null, null, null,
                        CultureInfo.InvariantCulture);
                }
                catch (MissingMethodException ex)
                {
                    throw new TypeLoadException(string.Format(
                      CultureInfo.CurrentCulture,
                      "The type '{0}' must have a private constructor to " +
                      "be used in the Singleton pattern.", theType.FullName)
                      , ex);
                }

                return inst;
            }
        }
    }

    public sealed class SequenceGeneratorSingleton : SingletonBase<SequenceGeneratorSingleton>
    {
        // Must have a private constructor so no instance can be created externally.
        SequenceGeneratorSingleton()
        {
            _number = 0;
        }

        private int _number;

        public int GetSequenceNumber()
        {
            return _number++;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Sequence: " + SequenceGeneratorSingleton.Instance
                .GetSequenceNumber().ToString());  // Print "Sequence: 0"

        }
    }
}
4

2 に答える 2

2

の場合tですか?する必要がありますT。いずれにせよ、クラス全体で一貫している必要があり、大文字が慣例です。

于 2012-04-20T04:44:19.750 に答える
1
public abstract class SingletonBase<t> where T : class

する必要があります:

public abstract class SingletonBase<T> where T : class

C#では大文字と小文字が区別されるためwhere T : class、型の削除で小文字のtを使用したため、コンパイラは不明なジェネリック型パラメータを参照していると見なしましたSingletonBase<t>

于 2012-04-20T04:45:49.513 に答える