Skip to content

Commit 69bf046

Browse files
committed
Merge pull request #73 from alextercete/bug/reference-type-tasks-throwing-exception
Fix error when returning Task of a reference type
2 parents e499bd3 + 4ec4793 commit 69bf046

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

Source/EmptyDefaultValueProvider.cs

+5-6
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private static object GetReferenceTypeDefault(Type valueType)
9393
else if (valueType == typeof(Task))
9494
{
9595
// Task<T> inherits from Task, so just return Task<bool>
96-
return GetCompletedTaskWithResult(false);
96+
return GetCompletedTaskForType(typeof (bool));
9797
}
9898
#endif
9999
else if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
@@ -115,9 +115,7 @@ private static object GetReferenceTypeDefault(Type valueType)
115115
else if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Task<>))
116116
{
117117
var genericType = valueType.GetGenericArguments()[0];
118-
119-
return GetCompletedTaskWithResult(
120-
genericType.IsValueType ? GetValueTypeDefault(genericType) : GetReferenceTypeDefault(genericType));
118+
return GetCompletedTaskForType(genericType);
121119
}
122120
#endif
123121

@@ -136,14 +134,15 @@ private static object GetValueTypeDefault(Type valueType)
136134
}
137135

138136
#if !NET3x && !SILVERLIGHT
139-
private static Task GetCompletedTaskWithResult(object result)
137+
private static Task GetCompletedTaskForType(Type type)
140138
{
141-
var type = result.GetType();
142139
var tcs = Activator.CreateInstance(typeof (TaskCompletionSource<>).MakeGenericType(type));
143140

144141
var setResultMethod = tcs.GetType().GetMethod("SetResult");
145142
var taskProperty = tcs.GetType().GetProperty("Task");
146143

144+
var result = type.IsValueType ? GetValueTypeDefault(type) : GetReferenceTypeDefault(type);
145+
147146
setResultMethod.Invoke(tcs, new[] {result});
148147
return (Task) taskProperty.GetValue(tcs, null);
149148
}

UnitTests/EmptyDefaultValueProviderFixture.cs

+18-5
Original file line numberDiff line numberDiff line change
@@ -123,23 +123,35 @@ public void ProvidesDefaultTask()
123123
}
124124

125125
[Fact]
126-
public void ProvidesDefaultGenericTask()
126+
public void ProvidesDefaultGenericTaskOfValueType()
127127
{
128128
var provider = new EmptyDefaultValueProvider();
129129

130-
var value = provider.ProvideDefault(typeof(IFoo).GetProperty("GenericTaskValue").GetGetMethod());
130+
var value = provider.ProvideDefault(typeof(IFoo).GetProperty("GenericTaskOfValueType").GetGetMethod());
131131

132132
Assert.NotNull(value);
133133
Assert.True(((Task)value).IsCompleted);
134134
Assert.Equal(default(int), ((Task<int>)value).Result);
135135
}
136136

137+
[Fact]
138+
public void ProvidesDefaultGenericTaskOfReferenceType()
139+
{
140+
var provider = new EmptyDefaultValueProvider();
141+
142+
var value = provider.ProvideDefault(typeof(IFoo).GetProperty("GenericTaskOfReferenceType").GetGetMethod());
143+
144+
Assert.NotNull(value);
145+
Assert.True(((Task)value).IsCompleted);
146+
Assert.Equal(default(string), ((Task<string>)value).Result);
147+
}
148+
137149
[Fact]
138150
public void ProvidesDefaultTaskOfGenericTask()
139151
{
140152
var provider = new EmptyDefaultValueProvider();
141153

142-
var value = provider.ProvideDefault(typeof(IFoo).GetProperty("TaskOfGenericTaskValue").GetGetMethod());
154+
var value = provider.ProvideDefault(typeof(IFoo).GetProperty("TaskOfGenericTaskOfValueType").GetGetMethod());
143155

144156
Assert.NotNull(value);
145157
Assert.True(((Task)value).IsCompleted);
@@ -162,8 +174,9 @@ public interface IFoo
162174
IQueryable QueryableObjects { get; }
163175
#if !NET3x && !SILVERLIGHT
164176
Task TaskValue { get; set; }
165-
Task<int> GenericTaskValue { get; set; }
166-
Task<Task<int>> TaskOfGenericTaskValue { get; set; }
177+
Task<int> GenericTaskOfValueType { get; set; }
178+
Task<string> GenericTaskOfReferenceType { get; set; }
179+
Task<Task<int>> TaskOfGenericTaskOfValueType { get; set; }
167180
#endif
168181
}
169182

0 commit comments

Comments
 (0)