C#7的一个很好的新功能是可以为类定义解构器,并将解构的值直接赋值给元组.
但是,在将对象解构为单个值的情况下,我找不到将其分配给元组的方法.虽然有一个带有单个元素(ValueTuple<T>)的元组类型,但是使用括号的简写语法在这里不起作用.我发现访问解构函数的唯一方法是Deconstruct直接调用该方法,但这消除了它的好处,因为我可以使用任何方法来实现这一目的.
有没有人知道将对象解构为单个值的更好方法?
这是我的测试代码:
class TestClass
{
private string s;
private int n;
public TestClass(string s, int n) => (this.s, this.n) = (s, n);
public void Deconstruct(out string s) => s = this.s;
public void Deconstruct(out string s, out int n) => (s, n) = (this.s, this.n);
}
static void Main(string[] args)
{
var testObject = new TestClass("abc", 3);
var (s1) = testObject; // sytax error (comma expected)
ValueTuple<string> t = testObject; // error: "no implicit …Run Code Online (Sandbox Code Playgroud) 在 Delphi (XE7) 中,是否有一种内置方法可以获取给定 MIME 类型的标准扩展名?
我正在寻找最简单和最通用的方法来实现一个可以这样调用的函数:
fileExt := GetExtension('text/xml');
Run Code Online (Sandbox Code Playgroud) 在C#7中,可以在表达式中引发异常:
int n = list != null ? list.Count : throw new NullReferenceException("list");
Run Code Online (Sandbox Code Playgroud)
在此位置,throw表达式可以替换任何类型的表达式.
现在我想定义一个在引发异常之前执行某些操作的函数:
??? DoSomethingAndThrowException(Exception e)
{
MessageBox.Show("Prepare for an exception!");
throw e;
}
Run Code Online (Sandbox Code Playgroud)
这样的函数的返回类型是什么,因此它可以在原始throw表达式的相同位置使用:
int n = list != null ? list.Count : DoSomethingAndThrowException(new NullReferenceException("list"));
Run Code Online (Sandbox Code Playgroud)
可以选择将其声明为通用方法:
T DoSomethingAndThrowException<T>(Exception e) {...}
Run Code Online (Sandbox Code Playgroud)
但这似乎很麻烦,因为泛型类型不会出现在函数体的任何地方.这是唯一的方法吗,或者是否有一些我不知道的类型,并且可以分配给任何类型(可以这么说是"反对象"类型)?
c# ×2
c#-7.0 ×2
compile-time ×1
delphi ×1
delphi-xe7 ×1
mime-types ×1
throw ×1
tuples ×1
types ×1