小编Hel*_*t D的帖子

C#7:如何使用元组将对象解构为单个值?

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)

c# tuples c#-7.0

7
推荐指数
2
解决办法
1872
查看次数

在 Delphi 中,如何获得给定 MIME 类型的标准文件扩展名?

在 Delphi (XE7) 中,是否有一种内置方法可以获取给定 MIME 类型的标准扩展名?

我正在寻找最简单和最通用的方法来实现一个可以这样调用的函数:

fileExt := GetExtension('text/xml');
Run Code Online (Sandbox Code Playgroud)

delphi file-extension mime-types delphi-xe7

4
推荐指数
2
解决办法
1731
查看次数

C#7中"throw"表达式的编译时类型是什么?

在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# types throw compile-time c#-7.0

3
推荐指数
1
解决办法
188
查看次数