相关疑难解决方法(0)

为什么结构中的迭代器可以修改它?

我发现允许修改值类型中的迭代器方法this.
但是,由于CLR的限制,调用方法看不到修改.(this按值传递)

因此,迭代器和非迭代器中的相同代码会产生不同的结果:

static void Main() {
    Mutable m1 = new Mutable();
    m1.MutateWrong().ToArray();     //Force the iterator to execute
    Console.WriteLine("After MutateWrong(): " + m1.Value);

    Console.WriteLine();

    Mutable m2 = new Mutable();
    m2.MutateRight();
    Console.WriteLine("After MutateRight(): " + m2.Value);
}

struct Mutable {
    public int Value;

    public IEnumerable<int> MutateWrong() {
        Value = 7;
        Console.WriteLine("Inside MutateWrong(): " + Value);
        yield break;
    }
    public IEnumerable<int> MutateRight() {
        Value = 7;
        Console.WriteLine("Inside MutateRight(): " + Value);
        return new int[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Inside …

.net c# iterator this value-type

11
推荐指数
1
解决办法
759
查看次数

IEnumerable这样的接口如何在没有正确实现的情况下工作?

根据我对接口的理解,为了使用它们,你必须通过在冒号后面添加接口的名称来声明一个类正在实现它,然后实现这些方法.

我目前正在学习枚举器,IEnumerable等等,这让我很困惑.这是我的意思的一个例子:

static IEnumerable<int> Fibs(int fibCount)
{
    for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) {
        yield return prevFib;
        int newFib = prevFib + curFib;
        prevFib = curFib;
        curFib = newFib;
    }
}
Run Code Online (Sandbox Code Playgroud)

IEnumerable似乎是一个普通的接口,我甚至检查了方法定义,这就是它的样子.

我怎么可能在方法定义中使用接口作为类型/返回类型,何时/如何知道我应该使用某些接口作为此示例中的类型?

编辑:我真的怀疑它与yield关键字有什么关系,因为很多接口都以这种方式用作属性,例如在模型中的MVC中,并像它一样传递给Views.例:

public IEnumerable<Category> Categories {get;set;}
Run Code Online (Sandbox Code Playgroud)

c# ienumerable interface

2
推荐指数
1
解决办法
626
查看次数

标签 统计

c# ×2

.net ×1

ienumerable ×1

interface ×1

iterator ×1

this ×1

value-type ×1