2012-01-21 34 views
10

请让我知道为什么ParameterizedThreadStart类只允许只有System.object参数类型包含的方法。ParameterizedThreadStart为什么只允许对象参数?

public class MainThreadTest 
{ 
    public static void Main(string[] args) 
    { 
     Thread T = new Thread(new ParameterizedThreadStart(DisplayYOrX)); 
     T.Start("X"); 

     DisplayYOrX("Y"); 
    } 

    static void DisplayYOrX(object outValue) 
    { 
     string Parameter = (string)outValue; 

     for(int i=0; i<10; i++) 
      Console.Write(Parameter); 
    } 
} 

为什么我想知道这是我不想再使用类型转换语法。

string Parameter = (string)outValue; 

回答

15

的原因限制是ThreadStart不是一个普通的委托,因此它只能传递一个object周围。这很容易解决,但通过使用lambda直接传递值。

public static void Main(string[] args) { 
    ThreadStart start =() => { 
    DisplayYOrX("X"); 
    }; 
    Thread t = new Thread(start); 
    t.Start(); 

    ... 
} 

static void DisplayYOrX(string outValue) { 
    ... 
} 

为C#2.0

public static void Main(string[] args) { 
    ThreadStart start = delegate { 
    DisplayYOrX("X"); 
    }; 
    Thread t = new Thread(start); 
    t.Start(); 

    ... 
} 
+0

我想,谁使用.NET Framework 2.0的开发者版本,拉姆达是很难使用。我对么 ? –

+0

@Frank我刚刚更新了我的答案,包括一个可以与2.0 C#编译器一起使用的版本。注意:即使在使用C#3.0或更高版本的编译器的2.0框架中,使用lambda语法也是有效的。无论哪种方式,我放在那里的第二个示例将适用于C#2.0以上的所有内容 – JaredPar

+0

我真的很感兴趣的是您说我们可以在2.0框架中使用lambda语法。那么,请你告诉我,我们该怎么做。任何参考链接? –

相关问题