6

プログラムのコンパイル中(MonoDevelop IDEからコンパイル)、エラーが発生します。

エラーCS0121:呼び出しが次のメソッドまたはプロパティ間であいまいです: System.Threading.Thread.Thread(System.Threading.ThreadStart)' and System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)'(CS0121)

ここにコードの一部があります。

Thread thread = new Thread(delegate {
    try
    {
        Helper.CopyFolder(from, to);
        Helper.RunProgram("chown", "-R www-data:www-data " + to);
    }
    catch (Exception exception)
    {
        Helper.DeactivateThread(Thread.CurrentThread.Name);
    }
    Helper.DeactivateThread(Thread.CurrentThread.Name);
});
thread.IsBackground = true;
thread.Priority = ThreadPriority.Lowest;
thread.Name = name;
thread.Start();
4

3 に答える 3

8

delegate { ... }およびを含む任意のデリゲート型に割り当てることができる匿名メソッドです。Thread クラスは両方の引数の型を持つコンストラクターのオーバーロードを提供するため、どちらのコンストラクターのオーバーロードが意味されているかはあいまいです。ThreadStartParameterizedThreadStart

delegate() { ... }(括弧に注意してください) は、引数を取らない無名メソッドです。またはなど、引数を取らないデリゲート型にのみ割り当てることができます。ActionThreadStart

したがって、コードを次のように変更します

Thread thread = new Thread(delegate() {

ThreadStartコンストラクターのオーバーロードを使用する場合、または

Thread thread = new Thread(delegate(object state) {

ParameterizedThreadStartコンストラクターのオーバーロードを使用する場合。

于 2013-02-16T13:23:48.240 に答える
2

このエラーは、オーバーロードのあるメソッドがあり、どちらのオーバーロードでも使用できる場合にスローされます。コンパイラーは、どのオーバーロードを呼び出すかがわからないため、パラメーターをキャストして明示的に指定する必要があります。これを行う1つの方法は次のとおりです。

Thread thread = new Thread((ThreadStart)delegate {
    try
    {
        Helper.CopyFolder(from, to);
        Helper.RunProgram("chown", "-R www-data:www-data " + to);
    }
    catch (Exception exception)
    {
        Helper.DeactivateThread(Thread.CurrentThread.Name);
    }
    Helper.DeactivateThread(Thread.CurrentThread.Name);
});
于 2013-02-16T13:21:12.297 に答える
0

または、ラムダを使用できます。

Thread thread = new Thread(() =>
{
    try
    {
        Helper.CopyFolder(from, to);
        Helper.RunProgram("chown", "-R www-data:www-data " + to);
    }
    catch (Exception exception)
    {
        Helper.DeactivateThread(Thread.CurrentThread.Name);
    }
    Helper.DeactivateThread(Thread.CurrentThread.Name);
});

thread.IsBackground = true;
thread.Priority = ThreadPriority.Lowest;
thread.Name = name;
thread.Start();        
于 2013-02-16T13:22:33.920 に答える