Я получил эту странную проблему, когда System.Action не может быть решена, если она явно не определена выше Чтобы объяснить это лучше, я покажу вам код
[TestMethod]
public void Channel_Dispatch_Waits_Before_Return()
{
//Action useless = null;
WorkflowChannel channel = new WorkflowChannel();
bool isHandeled = false;
channel.Subscribe(WorkflowHandlerFactory.FromLambdaAsync<int>((data, callback, onError) =>
{
// Go on another thread and sleep for a small ammount of time to simulate a async request
System.Threading.ThreadPool.QueueUserWorkItem(state =>
{
System.Threading.Thread.Sleep(100);
isHandeled = true;
callback();
});
}));
channel.Dispatch(1);
Assert.IsTrue(isHandeled);
}
Это дает ошибку времени компиляции, а именно:
Ошибка 1 Делегат «Действие» не принимает 0 аргументов C: \ Users *** \ Documents \ Visual Studio 2010 \ Projects \ MessageWorkflow \ MessageWorkfow.Test \ WorkflowChannelTest.cs 47 21 MessageWorkflow.Test
Однако, когда я раскомментирую строку:
Action useless = null;
Это не дает ошибку времени компиляции. Я пытался восстановить и т. Д., Но бесполезно.
Если требуется, объявление: FromLambdaAsync:
public static IWorkflowHandler FromLambdaAsync<T>(AsyncAction<T> method)
Где AsyncAction:
public delegate void AsyncAction<T>(T message, Action onComplete, Action<Exception> onError);
Это не шоу-стоппер, но я в замешательстве, так как не могу найти никакой логики за этим ... Кто может дать мне пощечину?
Ура!
* РЕДАКТИРОВАТЬ *
Мне удалось воспроизвести это поведение в самом простом тестовом примере, см .:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary2
{
public delegate void AsyncAction(Action onComplete);
public class WorkflowHandler
{
}
public class Main
{
public static WorkflowHandler FromLambdaAsync(AsyncAction method)
{
return new WorkflowHandler();
}
}
}
С модульным тестом:
using ClassLibrary2;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace TestProject1
{
[TestClass]
public class MainTest
{
[TestMethod()]
public void FromLambdaAsyncTest()
{
Main.FromLambdaAsync((callback) =>
{
callback();
});
}
}
}
Что дает мне ту же ошибку
Проект компилируется с использованием .NET 4.0 usign VS 2010 sp1
* РЕДАКТИРОВАТЬ 2: *
Упрощение теста еще больше, без изменений в результате
* РЕДАКТИРОВАТЬ 3 *
Даже в самом простом тестовом случае это не сработает, см .:
[TestMethod()]
public void FromLambdaAsyncTest()
{
AsyncAction action = c => c();
}