C# 7 ValueTuple 编译错误
C# 7 ValueTuple compile error
我正在使用 VS2017 RC,我的应用程序目标是 net framework 4.6.1。
我有两个程序集引用 System.ValueTuple 4.3
MyProject.Services
MyProject.WebApi
在 MyProject.Services 中,我有一个 class 使用这样的方法
public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
// Some code...
return (fCount, cCount, aCount);
}
在 MyProject.WebApi 中,我有一个使用这种方法的控制器:
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var vm = new ViewModel
{
FCount = stats.fCount,
CCount = stats.cCount,
ACount = stats.aCount
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
Intellisense 正在工作并解构元组,但是当我编译它时失败,错误列表 window 中没有任何错误。
在输出 windows 我有这个错误:
2>MyController.cs(83,31,83,40): error CS1061: 'ValueTuple' does not contain a definition for 'fCount' and no extension
method 'fCount' accepting a first argument of type 'ValueTuple' could be found (are you missing a using directive or an
assembly reference?) 2>MyController.cs(84,39,84,49): error CS1061:
'ValueTuple' does not contain a definition for 'cCount'
and no extension method 'cCount' accepting a first argument of type
'ValueTuple' could be found (are you missing a using
directive or an assembly reference?) 2>MyController.cs(85,35,85,40):
error CS1061: 'ValueTuple' does not contain a
definition for 'aCount' and no extension method 'aCount' accepting a
first argument of type 'ValueTuple' could be found (are
you missing a using directive or an assembly reference?)
我尝试添加 DEMO 和 DEMO_EXPERIMENTAL 构建标志,但仍然失败。
知道哪里出了问题吗?
编辑 1:
这段代码有效,统计数据被很好地解构了。我可能遇到了一个错误。
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var tu = stats.ToTuple();
var vm = new ViewModel
{
FCount = tu.Item1,
CCount = tu.Item2,
ACount = tu.Item3
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
编辑 2:
问题在 github 此处打开:https://github.com/dotnet/roslyn/issues/16200
我想是因为你没有定义fCount、acCount和aCcount。试试这个
public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
// Some code...
//fCount, cCount, aCount are not defined here, so you should define them
var fCount = 0;
var cCount= 0;
var aCount = 0;
return (fCount , cCount, aCount );
//Other ways:
//return (fCount : 0, cCount: 0, aCount : 0);
//return new (int fCount , int cCount, int aCount ) { fCount = 0, cCount = 0, aCount = 0 };
}
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var vm = new ViewModel
{
FCount = stats.fCount,
CCount = stats.cCount,
ACount = stats.aCount
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
根据@Swell 建议编辑
如果有人落入同样的陷阱,要解决这个问题你需要更新这个包:
Microsoft.Net.Compilers 到 2.0(需要显示预发布)
我只想补充其他答案。
从引用中删除 System.valuetuple。否则,它不起作用,我不知道为什么。基本上,值元组已经在 4.7.2 中,所以如果你使用 visual studio 2019 你就全部设置好了。
如果您使用 visual studio 2019 而我使用了,那对我来说就是有用的。我不知道为什么。不需要金块。无需直接引用。
将您的项目定位为使用 .net Framework 4.7.2 并删除对 valuetuple 的引用。
我正在使用 VS2017 RC,我的应用程序目标是 net framework 4.6.1。
我有两个程序集引用 System.ValueTuple 4.3
MyProject.Services MyProject.WebApi
在 MyProject.Services 中,我有一个 class 使用这样的方法
public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
// Some code...
return (fCount, cCount, aCount);
}
在 MyProject.WebApi 中,我有一个使用这种方法的控制器:
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var vm = new ViewModel
{
FCount = stats.fCount,
CCount = stats.cCount,
ACount = stats.aCount
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
Intellisense 正在工作并解构元组,但是当我编译它时失败,错误列表 window 中没有任何错误。 在输出 windows 我有这个错误:
2>MyController.cs(83,31,83,40): error CS1061: 'ValueTuple' does not contain a definition for 'fCount' and no extension method 'fCount' accepting a first argument of type 'ValueTuple' could be found (are you missing a using directive or an assembly reference?) 2>MyController.cs(84,39,84,49): error CS1061: 'ValueTuple' does not contain a definition for 'cCount' and no extension method 'cCount' accepting a first argument of type 'ValueTuple' could be found (are you missing a using directive or an assembly reference?) 2>MyController.cs(85,35,85,40): error CS1061: 'ValueTuple' does not contain a definition for 'aCount' and no extension method 'aCount' accepting a first argument of type 'ValueTuple' could be found (are you missing a using directive or an assembly reference?)
我尝试添加 DEMO 和 DEMO_EXPERIMENTAL 构建标志,但仍然失败。
知道哪里出了问题吗?
编辑 1:
这段代码有效,统计数据被很好地解构了。我可能遇到了一个错误。
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var tu = stats.ToTuple();
var vm = new ViewModel
{
FCount = tu.Item1,
CCount = tu.Item2,
ACount = tu.Item3
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
编辑 2:
问题在 github 此处打开:https://github.com/dotnet/roslyn/issues/16200
我想是因为你没有定义fCount、acCount和aCcount。试试这个
public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
// Some code...
//fCount, cCount, aCount are not defined here, so you should define them
var fCount = 0;
var cCount= 0;
var aCount = 0;
return (fCount , cCount, aCount );
//Other ways:
//return (fCount : 0, cCount: 0, aCount : 0);
//return new (int fCount , int cCount, int aCount ) { fCount = 0, cCount = 0, aCount = 0 };
}
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var vm = new ViewModel
{
FCount = stats.fCount,
CCount = stats.cCount,
ACount = stats.aCount
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
根据@Swell 建议编辑
如果有人落入同样的陷阱,要解决这个问题你需要更新这个包: Microsoft.Net.Compilers 到 2.0(需要显示预发布)
我只想补充其他答案。
从引用中删除 System.valuetuple。否则,它不起作用,我不知道为什么。基本上,值元组已经在 4.7.2 中,所以如果你使用 visual studio 2019 你就全部设置好了。
如果您使用 visual studio 2019 而我使用了,那对我来说就是有用的。我不知道为什么。不需要金块。无需直接引用。
将您的项目定位为使用 .net Framework 4.7.2 并删除对 valuetuple 的引用。