Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
67d75c04
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
67d75c04
编写于
7月 26, 2019
作者:
C
Charles Stoner
提交者:
GitHub
7月 26, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Use signature return type to determine task type in NullableWalker (#37488)
上级
a0009846
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
61 addition
and
2 deletion
+61
-2
src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs
src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs
+1
-1
src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs
src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs
+1
-1
src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
...rp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
+59
-0
未找到文件。
src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs
浏览文件 @
67d75c04
...
@@ -1520,7 +1520,7 @@ private void EmitCallExpression(BoundCall call, UseKind useKind)
...
@@ -1520,7 +1520,7 @@ private void EmitCallExpression(BoundCall call, UseKind useKind)
// otherwise we should not use direct 'call' and must use constrained call;
// otherwise we should not use direct 'call' and must use constrained call;
// calling a method defined in a value type
// calling a method defined in a value type
Debug
.
Assert
(
TypeSymbol
.
Equals
(
receiverType
,
methodContainingType
,
TypeCompareKind
.
ConsiderEverything2
));
Debug
.
Assert
(
TypeSymbol
.
Equals
(
receiverType
,
methodContainingType
,
TypeCompareKind
.
ObliviousNullableModifierMatchesAny
));
tempOpt
=
EmitReceiverRef
(
receiver
,
receiverAddresskind
);
tempOpt
=
EmitReceiverRef
(
receiver
,
receiverAddresskind
);
callKind
=
CallKind
.
Call
;
callKind
=
CallKind
.
Call
;
}
}
...
...
src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs
浏览文件 @
67d75c04
...
@@ -1419,7 +1419,7 @@ private bool TryGetReturnType(out TypeWithAnnotations type)
...
@@ -1419,7 +1419,7 @@ private bool TryGetReturnType(out TypeWithAnnotations type)
return
true
;
return
true
;
}
}
if
(
method
.
IsGenericTaskReturningAsync
(
compilation
))
if
(
returnType
.
Type
.
IsGenericTaskType
(
compilation
))
{
{
type
=
((
NamedTypeSymbol
)
returnType
.
Type
).
TypeArgumentsWithAnnotationsNoUseSiteDiagnostics
.
Single
();
type
=
((
NamedTypeSymbol
)
returnType
.
Type
).
TypeArgumentsWithAnnotationsNoUseSiteDiagnostics
.
Single
();
return
true
;
return
true
;
...
...
src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
浏览文件 @
67d75c04
...
@@ -113357,5 +113357,64 @@ public interface IEquatable<T>
...
@@ -113357,5 +113357,64 @@ public interface IEquatable<T>
", options: WithNonNullTypesTrue().WithSpecificDiagnosticOptions("CS0436", ReportDiagnostic.Suppress));
", options: WithNonNullTypesTrue().WithSpecificDiagnosticOptions("CS0436", ReportDiagnostic.Suppress));
comp.VerifyDiagnostics();
comp.VerifyDiagnostics();
}
}
[Fact]
[WorkItem(37269, "https://github.com/dotnet/roslyn/issues/37269")]
public void TypeParameterReturnType_01()
{
var source =
@"using System;
using System.Threading.Tasks;
static class ResultExtensions
{
static async Task<Result<TResult, B>> MapAsync<A, B, TResult>(
this Result<A, B> result,
Func<A, Task<TResult>> map)
{
return await result.Match(
async a => FromA<TResult>(await map(a)),
b => Task.FromResult(FromB<TResult, B>(b)));
}
static Result<A, B> FromA<A, B>(A value) => throw null!;
static Result<A, B> FromB<A, B>(B value) => throw null!;
}
class Result<A, B>
{
public TResult Match<TResult>(Func<A, TResult> a, Func<B, TResult> b) => throw null!;
}";
var comp = CreateCompilation(source, options: WithNonNullTypesTrue());
comp.VerifyDiagnostics(
// (10,24): error CS0305: Using the generic method 'ResultExtensions.FromA<A, B>(A)' requires 2 type arguments
// async a => FromA<TResult>(await map(a)),
Diagnostic(ErrorCode.ERR_BadArity, "FromA<TResult>").WithArguments("ResultExtensions.FromA<A, B>(A)", "method", "2").WithLocation(10, 24));
}
[Fact]
public void TypeParameterReturnType_02()
{
var source =
@"using System;
using System.Threading.Tasks;
static class ResultExtensions
{
static async Task<Result<TResult, B>> MapAsync<A, B, TResult>(
this Result<A, B> result,
Func<A, Task<TResult>> map)
{
return await result.Match(
async a => FromA<TResult, B>(await map(a)),
b => Task.FromResult(FromB<TResult, B>(b)));
}
static Result<A, B> FromA<A, B>(A value) => throw null!;
static Result<A, B> FromB<A, B>(B value) => throw null!;
}
class Result<A, B>
{
public TResult Match<TResult>(Func<A, TResult> a, Func<B, TResult> b) => throw null!;
}";
var comp = CreateCompilation(source, options: WithNonNullTypesTrue());
// Use VerifyEmitDiagnostics() to test assertions in CodeGenerator.EmitCallExpression.
comp.VerifyEmitDiagnostics();
}
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录