- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可以在 C# 7.3(框架 4.8)中正确编译:
(string, string) s = ("a", "b");
(object, string) o = s;
我知道这是以下内容的语法糖,它也可以正确编译:
ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
所以,看起来 ValueTuples 可以被分配 covariantly ,这太棒了!
不幸的是,我不明白为什么:我的印象是 C# only supported covariance on interfaces and delegates 。 ValueType
两者都不是。
事实上,当我尝试用自己的代码复制此功能时,我失败了:
struct MyValueTuple<A, B>
{
public A Item1;
public B Item2;
public MyValueTuple(A item1, B item2)
{
Item1 = item1;
Item2 = item2;
}
}
...
MyValueTuple<string, string> s = new MyValueTuple<string, string>("a", "b");
MyValueTuple<object, string> o = s;
// ^ Cannot implicitly convert type 'MyValueTuple<string, string>' to 'MyValueTuple<object, string>'
那么,为什么 ValueTuple
可以协变赋值,而 MyValueTuple
却不能?
最佳答案
我相信这里实际发生的是解构赋值。元组分配将尝试隐式转换其组件,并且由于可以将 string
分配给 object
,这就是这里发生的情况。
The language supports assignment between tuple types that have the same number of elements, where each right-hand side element can be implicitly converted to its corresponding left-hand side element. Other conversions aren't considered for assignments.
关于c# - 是什么让 ValueTuple 具有协变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59411397/
考虑以下类型: (int, int) → 管理。 struct MyStruct { public (int,int) Value; } → 不受管理! 问题: 非泛型结构 MyStruct ,它有一
我如何检查 ValueTuple 列表的类型是否为 List , 不考虑参数的类型。 可能是: new List() new List() new List() 我尝试过的 public stati
B"H 我正在尝试使用 C# 7 的新元组功能,但遇到了一些问题。实际上,它们工作正常,我不确定是什么改变导致它们损坏。 我正在使用 ASP.Net 4、MVC 5,目标是 .net framewor
命名 ValueTuple 元素时,是否应该大写? (string Name, int Index) rec; 或 (string name, int index) rec; 编辑: 似乎约定是 Pa
我正在尝试使用反射在运行时设置 ValueTuple 的字段,但遇到了问题。我怀疑我不了解 FieldInfo.SetValue 的工作原理。 var a = (5, 5); a.Item1 = 6;
是否可以编写一个 C# 方法来接受具有任意数量的相同类型的值元组并将它们转换为列表? 编辑 2/6/2019我接受了提供的答案作为正确答案。我还想提供一个使用不是接口(interface)的基类的解决
我将返回大型 List 对象作为我的 ValueTuple 中的参数之一。像这样的东西: (bool success, List data string error)> Get(string temp
我有一个用例,我需要检查某个值是否为 C# 7 ValueTuple,如果是,则循环遍历每个项目。我尝试检查 obj is ValueTuple 和 obj is (object, object) 但
我尝试使用 ValueTuple 结构并尝试实现一个不可变的复合键。键由值类型组成。 我试图通过一些单元测试来破坏以下实现,但到目前为止没有成功。我错过了什么吗? 此外,这只是出于好奇,我想了解 Va
当我检查我的缓存以查看我的 ValueTuple 是否在缓存中时,我使用下面的代码。在这种情况下,返回的值为空(也就是缓存中不存在)。当代码运行时,我在第一行收到 object not set to
我在 C# 中尝试 ValueTuple 类,我对属性命名有疑问,让我们看看: 如果实例化一个 ValueTuple 声明这样的对象:var tuple1 = (Name: "Name1", Age:
假设我有一个方法 foo,它返回一个 ValueTuple,其中一个成员是一次性的,例如 (IDisposable, int) . 确保调用方正确处理返回的一次性对象的最佳方法是什么? 我尝试了以下方
我想这可能是一本方便的字典: var myDict = new Dictionary(); 散列会是什么样子? 等效的键类型(结构)是什么样的? 最佳答案 是的,没关系。 ValueTuple fam
有一个方法接收一个ValueTuple,修改后返回。在这种情况下,我可以在方法参数中指定 ValueTuple 的字段名吗? private static void Operation() {
如何像这样创建超过八个值的 ValueTuple 列表: (int Id, string FirstName, string LastName, int Vek, int City, int Zip,
这可以在 C# 7.3(框架 4.8)中正确编译: (string, string) s = ("a", "b"); (object, string) o = s; 我知道这是以下内容的语法糖,它也可
这个问题已经有答案了: Why can't class fields be var? [duplicate] (4 个回答) 已关闭 4 年前。 我想初始化 ValueTuples 的静态只读数组,我
我刚刚将一个 DLL 文件包含到我的项目中,并且正在使用一种返回 List 的方法。 .我最近才意识到 ValueTuple C# 7 中的数据类型,并希望使用它而不是返回的普通元组。我知道我可以循环
这个问题已经有答案了: Why can't class fields be var? [duplicate] (4 个回答) 已关闭 4 年前。 我想初始化 ValueTuples 的静态只读数组,我
我刚刚将一个 DLL 文件包含到我的项目中,并且正在使用一种返回 List 的方法。 .我最近才意识到 ValueTuple C# 7 中的数据类型,并希望使用它而不是返回的普通元组。我知道我可以循环
我是一名优秀的程序员,十分优秀!