我已经安装了一周前发布的Visual Studio 2017社区,我开始探索C#7的新功能.
所以我创建了一个返回两个值的简单方法:
public class Program
{
public static void Main(string[] args)
{
(int sum, int count) a = ReturnTwoValues();
}
static (int sum, int count) ReturnTwoValues() => (1, 1);
}
Run Code Online (Sandbox Code Playgroud)
编译器生成错误:
错误CS8137无法定义使用元组的类或成员,因为无法找到编译器所需类型"System.Runtime.CompilerServices.TupleElementNamesAttribute".你错过了参考吗?
我试着用这个名字在框架中找到一个引用,但没有运气!
如果我们需要额外的东西来使用C#7.0功能,那么我们需要为每个项目做到这一点非常奇怪吗?
我基本上是在寻找一种方法来使用c#中的二维类型键来访问哈希表值.
最终我可以做这样的事情
HashTable[1][false] = 5;
int a = HashTable[1][false];
//a = 5
Run Code Online (Sandbox Code Playgroud)
这就是我一直在尝试的......没有用
Hashtable test = new Hashtable();
test.Add(new Dictionary<int, bool>() { { 1, true } }, 555);
Dictionary<int, bool> temp = new Dictionary<int, bool>() {{1, true}};
string testz = test[temp].ToString();
Run Code Online (Sandbox Code Playgroud) 在C#7中是否可以在字典中的foreach循环中使用解构?像这样的东西:
var dic = new Dictionary<string, int>{ ["Bob"] = 32, ["Alice"] = 17 };
foreach (var (name, age) in dic)
{
Console.WriteLine($"{name} is {age} years old.");
}
Run Code Online (Sandbox Code Playgroud)
它似乎不适用于Visual Studio 2017 RC4和.NET Framework 4.6.2:
错误CS1061:'KeyValuePair'不包含'Deconstruct'的定义,并且没有扩展方法'Deconstruct'可以找到接受类型'KeyValuePair'的第一个参数(你是否缺少using指令或汇编引用?)
我正在使用VS2017 RC,我的应用程序以net framework 4.6.1为目标.
我有两个引用System.ValueTuple 4.3的程序集
MyProject.Services MyProject.WebApi
在MyProject.Services中,我有一个类,有这样的方法
public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
// Some code...
return (fCount, cCount, aCount);
}
Run Code Online (Sandbox Code Playgroud)
在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);
}
Run Code Online (Sandbox Code Playgroud)
Intellisense正在工作并解构元组,但是当我编译它时失败而没有错误列表窗口中的任何错误.在输出窗口中我有这个错误:
2> MyController.cs(83,31,83,40):错误CS1061:'ValueTuple'不包含'fCount'的定义,并且没有扩展方法'fCount'接受类型'ValueTuple'的第一个参数可以找到(你错过了using指令或程序集引用吗?)2> MyController.cs(84,39,84,49):错误CS1061:'ValueTuple'不包含'cCount'的定义,也没有扩展方法'cCount'接受可以找到类型为'ValueTuple'的第一个参数(你是否缺少using指令或汇编引用?)2> MyController.cs(85,35,85,40):错误CS1061:'ValueTuple'不包含定义对于'aCount'并且没有扩展方法'aCount'可以找到接受类型'ValueTuple'的第一个参数(你是否缺少using指令或汇编引用?)
我尝试添加DEMO和DEMO_EXPERIMENTAL构建标志但仍然失败.
什么是错的?
编辑1:
此代码有效,统计数据解析得很好.我可能遇到了一个bug.
public async Task<HttpResponseMessage> GetInfoAsync()
{
// …Run Code Online (Sandbox Code Playgroud) 我尝试将我的项目更新为.NET Standard 2.0,在测试期间我遇到了异常:
System.IO.FileLoadException:'无法加载文件或程序集"System.ValueTuple,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51"或其依赖项之一.找到的程序集清单的定义与程序集的引用不匹配.
这是package.config中存在的assambly 并存在于包的文件夹中.我尝试了一些版本的System.ValueTuple包,结果是一个.
为什么依赖的版本«0.0.0.0»?
有没有人对这个问题有所了解?
VS 2017 Preview,UnitTestApp,.NET Framework 4.7.
在单元测试应用程序中,我创建EF模型(Microsoft.EntityFrameworkCore,Microsoft.EntityFrameworkCore.SqlServer 2.0.0-preview2-final,它需要在.NET Standard应用程序中).Unit测试方法 - 使用EF db模型在表中插入一些行,然后调用'savechanges',然后抛出此异常.
当我使用EntityFrameworkCore 1.1.2(带有EF模型的dll - 标准1.4,单元测试框架4.6.2)时 - 这个测试运行良好.
我正在将现有的解决方案从.NET 4.6.2升级到.NET 4.7.此解决方案依赖于几个针对.NET 4.6.2的nuget包,因此依赖于nuget System.ValueTuple包.
但升级后,我收到了大量这些构建错误:
Error CS8179 Predefined type 'System.ValueTuple`2' is not defined or imported
我无法取出System.ValueTuple包,在评论中建议在这里,因为其他软件包依赖于它.(如果我强迫它,它们似乎会爆炸.)
有什么建议?
更新8/8/17
我已经发现我可以删除System.ValueTuple包,我可以通过这种方式获得编译解决方案.但是,我在解决方案中有十几个NuGet包似乎是针对.NET 4.6.2,因此需要System.ValueTuple作为依赖.我可以安装它们,然后强制删除System.ValueTuple软件包,但是如果这些软件包中的任何软件包有更新,并且我安装了更新 - 那么System.ValueTuple软件包将再次安装,系统将停止构建,直到我再次删除软件包.
换句话说,我可以做到这一切 - 但它似乎很尴尬和kludgy.当然有更好的方法来解决这个问题吗?
我想将ListView绑定到List<string>.我正在使用此代码:
somelistview.DataBindings.Add ("Items", someclass, "SomeList");
Run Code Online (Sandbox Code Playgroud)
我收到此异常:无法绑定到属性'Items',因为它是只读的.
如果Items属性是只读的,我不知道如何绑定?
我使用异步方法和分别返回多个值的方法。在这种特定情况下,以下“ GetTaskTypeAndId()”方法应异步并应同时返回多个值。如何使该方法异步?
public async Task DeleteSchoolTask(int schoolNumber, int taskDetailId)
{
var result = GetTaskTypeAndId(taskDetailId); // This should be called asynchronously
int taskId = result.Item1;
string taskType = result.Item2;
// step 1: delete attachment physically from server
var fileService = new FileService(Logger, CurrentUser);
var relativeFilePath = $"{schoolNumber}\\{Consts.RM_SCHOOL}\\{taskDetailId}";
fileService.DeleteAttachmentFolderFromServer(Consts.CONFIG_SMP_UPLOADFILE_ROOTPATH, relativeFilePath);
// step 2: delete records from database
await _routineMaintenanceRepo.Value.DeleteSchoolTask(taskDetailId);
}
public (int, string) GetTaskTypeAndId(int taskDetailId) // How should I write this line using 'async Task'?
{
var detailRecord = await _routineMaintenanceRepo.Value.GetDetailRecord(taskDetailId);
int …Run Code Online (Sandbox Code Playgroud) asynchronous return-value async-await entity-framework-core c#-7.0
c# ×7
c#-7.0 ×5
.net ×3
async-await ×1
asynchronous ×1
data-binding ×1
dictionary ×1
hashtable ×1
nuget ×1
return ×1
return-value ×1
winforms ×1