- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个使用 Deconstruct() 方法的结构(Point 和 Size)。两者都返回 (int, int) 元组。
我试图在 switch 中将它们解构为 (int, int) 元组变量,但没有成功。编译器给我错误:
Cannot implicitly convert type 'Size' to '(int, int)'.
如何将这两个结构解构为一个元组,以便能够在第二个 switch 表达式中使用它?
using System;
class Program
{
static string DescribeSize<TDeconstructable>(TDeconstructable deconstructableStruct)
where TDeconstructable : struct
{
(int, int) xy;
switch (deconstructableStruct)
{
case Size size:
xy = size; //CS0029 error: Cannot implicitly convert type 'Size' to '(int, int)'
break;
case Point point:
xy = point; //CS0029 error: Cannot implicitly convert type 'Point' to '(int, int)'
break;
default:
xy = (0, 0);
break;
}
return xy switch
{
(0, 0) => "Empty",
(0, _) => "Extremely narrow",
(_, 0) => "Extremely wide",
_ => "Normal"
};
}
static void Main(string[] args)
{
var size = new Size(4, 0);
var point = new Point(0, 7);
Console.WriteLine(DescribeSize(size));
Console.WriteLine(DescribeSize(point));
}
}
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Deconstruct(out int x, out int y)
{
x = X;
y = Y;
}
}
public readonly struct Size
{
public int W { get; }
public int H { get; }
public Size(int w, int h)
{
W = w;
H = h;
}
public void Deconstruct(out int w, out int h)
{
w = W;
h = H;
}
}
最佳答案
没有到 ValueTuple
的隐式转换,并且您的赋值不会调用解构。您实质上是在尝试执行以下不合法的操作:
xy = (ValueTuple<int, int>)size;
您需要两个变量,而不是一个。如果您认为解构只是调用 Deconstruct
方法的编译器技巧/语法糖,这一点就会变得更加明显。如果您打算手动调用它,则需要将两个变量作为out
参数传递,而不是一个。
int x, y;
size.Deconstruct(out x, out y);
没有采用单个 元组的重载。那将如何工作?只有一个变量。我想您可能认为编译器可以做一些类似于:
size.Deconstruct(out xy.Item1, out xy.Item2);
不幸的是,它没有。对于您的情况,您需要单独声明变量(而不是作为 ValueTuple
),然后使用解构和元组语法来分配给它们。如果您愿意,可以将 default
情况下的赋值从 switch
中移出,让两个变量的声明更像元组:
var (x, y) = (0, 0); // two variables
switch (deconstructableStruct)
{
case Size size:
(x, y) = size;
break;
case Point point:
(x, y) = point;
break;
}
以后你仍然可以打开值,你只需要使用元组语法:
return (x, y) switch {
(0, 0) => "Empty",
(0, _) => "Extremely narrow",
(_, 0) => "Extremely wide",
_ => "Normal"
};
参见 this answer一个好的替代方案:如果您真的需要一个本身是元组类型的变量(并且您可以也不需要),则编写您自己的隐式
转换运算符不介意修改 Size
和 Point
类型来添加此行为)。
关于c# - 无法将可解构类型隐式转换为元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61762167/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!