不C#有一个相当于卡拉的结构打字?
-
26-09-2019 - |
题
在斯,我可以定义 结构类型 如下:
type Pressable = { def press(): Unit }
这意味着,我可以定义的一个函数或方法,这需要作为一个参数的东西是Pressable,像这样:
def foo(i: Pressable) { // etc.
对象我穿这个功能必须有为其定义的一种方法称为新闻()类型相匹配的签名定义的类型--没有论点,回返部(卡拉版本的空隙).
我甚至可以使用的结构类型的内联:
def foo(i: { def press(): Unit }) { // etc.
它基本上允许该程序员的所有福利的鸭子类型的同时仍然具有利益的汇编时的类型检查。
不C#有类似的东西吗?我已经Google搜索,但无法找到任何东西,但是我不熟悉C#在任何深度。如果没有,是否有任何计划来添加这样?
解决方案
没有,也没有计划,我知道的。仅称为(而不是结构)子类型(例如接口)。
(其他人可能希望也看
http://en.wikipedia.org/wiki/Nominative_type_system
http://en.wikipedia.org/wiki/Structural_type_system
)
(有些人可能会指出一些异国情调的角落情况下,如使用foreach
结构打字的GetEnumerator
声明,但这是的例外而不是规则。)
其他提示
没有一种方法来定义具有特定功能的结构类型。存在着增加了C#鸭打字支持,可以发现此处文库。
这是从鸭打字项目的例子。请注意,在鸭子类型发生在运行时,可以失败。这是我的理解也是这个库是鸭输入的类型,这是远从在斯卡拉享受优雅的编译时支持哭生成代理。这是最有可能的好,因为它与这一代的C#获取。
public interface ICanAdd
{
int Add(int x, int y);
}
// Note that MyAdder does NOT implement ICanAdd,
// but it does define an Add method like the one in ICanAdd:
public class MyAdder
{
public int Add(int x, int y)
{
return x + y;
}
}
public class Program
{
void Main()
{
MyAdder myAdder = new MyAdder();
// Even though ICanAdd is not implemented by MyAdder,
// we can duck cast it because it implements all the members:
ICanAdd adder = DuckTyping.Cast<ICanAdd>(myAdder);
// Now we can call adder as you would any ICanAdd object.
// Transparently, this call is being forwarded to myAdder.
int sum = adder.Add(2, 2);
}
}
这是使用良好醇镗接口实现同样的事情的C#方式。
interface IPressable {
void Press();
}
class Foo {
void Bar(IPressable pressable) {
pressable.Press();
}
}
class Thingy : IPressable, IPushable, etc {
public void Press() {
}
}
static class Program {
public static void Main() {
pressable = new Thingy();
new Foo().Bar(pressable);
}
}
正如其他人指出,这不是 真的 可用。净额(因为这更是一个问题的运行于一语言)。但是,.净4.0支持类似的事情对进口COM接口,我认为这可能被用于实施结构类型。网。看看这篇文章:
我没有尝试用我自己,但我认为这可能会使编译作者编写语言的结构类型。网。(这个想法是,你(或一个编译器)将定义一个接口背后的现场,但它的工作,因为该接口将被视为等同由于COM等同功能)。
此外,C#4.0支持 dynamic
关键词,我认为,可以被解释为一个结构类型(带有静态型检查).关键词允许你打电话的方法上的任何对象,不knowning(在编写时)的对象是否将具有所需的方法。这基本上是同样的事情作为在"鸭打字"的项目提到由伊戈尔(但是这当然不是一个适当的结构类型).
C#中的awaitable图案也许可以解释为结构亚型/存在打字的限制,特设实例。编译器将只await
有权访问一个GetAwaiter()
方法对象返回与一组特定的方法和属性的任何INotifyCompletion
对象。因为无论是“awaitable”对象,也不是“awaiter”对象需要实现任何接口(除了在后一种情况下INotifyCompletion
),await
类似于接受结构上类型化的对象awaitable的方法。