2012-04-20 21 views
1

私はsingleton base class articleからいくつかのコードを試しています。しかし、コンパイルすると、エラーメッセージが表示されます。私は、4.0のクライアントフレームワークではなく、プロジェクトのターゲットフレームワークが4.0であることを確認しました。コードの何が間違っていますか?ここで型または名前空間の名前 'T'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありません)

はコードです:

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" 

     } 
    } 
} 

答えて

2

はそれがtの場合ですか?それはTでなければなりません。とにかく、それはあなたのクラスを通して一貫している必要があり、大文字は大会です。

+1

Oh my!たぶん、休憩が必要なのかもしれません。 –

+1

または新しい眼鏡。 –

1
public abstract class SingletonBase<t> where T : class 

は次のようになります。コンパイラはあなたがタイプdelcaration、SingletonBase<t>に小文字のトンを使用するので、未知のジェネリック型パラメータを参照するものとしてwhere T : classを見たよう

public abstract class SingletonBase<T> where T : class 

C#が大文字と小文字が区別されます。