Mar*_*ell 11
要被视为结构,编译器必须在编译时知道具体类型是什么,以在堆栈上保留正确的空间.这意味着即使结构实现IFoo,然后使用:
var ms = new MyStruct();
IFoo foo = ms;
Run Code Online (Sandbox Code Playgroud)
然后分配到foo拳击操作.你可以说"编译器应该发现它只是foo并使用'constained'操作码",但在一般情况下(有多个赋值foo等)这是不可能的(我会冒险猜测它会遇到"停滞问题").
还存在虚拟和静态调用的问题,但"受约束"的操作码可以解决这个问题.
基本上,必须始终将接口的任何用法视为参考.
这有一个例外:通用约束.
如果你有
static void DoBar<T>(T target) where T : IFoo {
target.Bar();
}
Run Code Online (Sandbox Code Playgroud)
这里的方法是每个值类型JITted一次,因此所需的堆栈空间T 是已知的; 呼叫Bar是"受约束的",可以根据需要自动进行虚拟或静态.
| 归档时间: |
|
| 查看次数: |
2390 次 |
| 最近记录: |