This document lists some basic differences between Nemerle and C# in a terse form. If you know Java or C++ it should still be fairly helpful.

Changes In Expressions

C# Nemerle Remarks
const int x = 3;
const string y = "foo";
readonly Object obj = getObject();
def x : int = 3;
def y : string = "foo";
def obj : Object = getObject();
Variables defined with def cannot be changed once defined. This is similar to readonlyor const in C# orfinal in Java. Most variables in Nemerle aren't explicitly typed like this.
int x = 3;
string y = "foo";
Object obj = getObject();
mutable x : int = 3;
mutable y : string = "foo";
mutable obj : Object = getObject();
Variables defined with mutable can be changed once defined. Most variables in Nemerle aren't explicitly typed like this.
var = 3; //Will compile.
var y; y = "foo";//Won't compile.
def = 3;//Will compile!
mutable y; y = "foo";//Will compile!
Nemerle's type inference is lightyears ahead of C#'s. If there is clear evidence of a variable's type, there's a 99% chance Nemerle will infer it.
int a = b = c;
def a = c;
def b = c;
The type of the assignment operator is void.
value = cond ? var1 : var2;
value = if(cond) var1 else var2
No ternary operator is needed as everything is an expression in Nemerle. The 'else' branch is mandatory here! (Don't panic! if-without-else has its own keyword.)
Class myClass = new Class(parms);
def myClass = Class(parms);
Nemerle doesn't require new when calling a constructor.
Book[] books = new Book[size];
def books = array(size) : array[Book];
Often the array type can be inferred and this is simplified; as in the next example.
Book[] books = new Book[size];
books[0] = new Book();
def books = array(size);
books[0] = Book();
When the type can be inferred from context or later use (which is most of the time), you can drop the type declaration
int[] numbers = {1, 2, 3};
def numbers = array[1, 2, 3];
Initializing an array. Without the arraykeyword this would create a list.
int[,] numbers = new int[2,3];
def numbers = array(2,3) : array.[2][int];
Multidimensional array constructor. The type can usually be inferred from use and not declared.
int[,] numbers = { {1,2,3}, {1,4,9} };
def numbers = [ [1,2,3], [1,4,9] ];
Multidimensional array initialization.
new {Prop1 = 1; Prop2 = "string"}
using Nemerle.Extensions;
new (Prop1 = 1, Prop2 = "string")
Nemerle anonymous typesare a bit more flexible (e. g. can be generic or returned from a method). They must be imported from Nemerle.Extensions however.
new Class {
Property1 = 1;
Property2 = "string"
}
Class()
The Nemerle Object Modifier macro is more powerful.
if(cond)
answer = 42;
...
when(cond)
answer = 42;
...
if without else is called when. Nemerle requiresif statements to be paired with elsefor clarity.
if(!cond)
answer = 42;
...
unless(cond)
answer = 42;
...
In Nemerle,if(!cond) can use the clearerunless(cond)syntax. Of course,when(!cond) can also always be used.
if (cond)
return foo;
do_something ();
return bar;
match(cond){
| true => foo
| _ => {doSomething(); foo}
}
Pattern Matchingprovides a clearer way of delegating control flow.
if (cond)
return foo;
do_something ();
return bar;
using Nemerle.Imperative;
when(cond)
return foo
do_something ();
return bar;
Alternately the Imperative namespace may be imported. This isdiscouragedhowever.
try {...}
catch (FooException e) { ... }
catch (BarException e) { ... }
try {...}
catch {
| e is FooException => ...
| e is BarException => ...
}
Nemerle's somewhat differenttry ... catchsyntax is consistent with its pattern matching syntax.
(type) expr
expr :> type
Runtime type cast, allows for downcasts and upcasts.
(type) expr
expr : type
Static cast, only upcasts are allowed.
using System;
using SWF = System.Windows.Forms;
using System.Xml;
...
Console.WriteLine ("foo");
SWF.Form x = new SWF.Form();
XmlDocument doc = new XmlDocument();
using System;
using System.Console;
using SWF = System.Windows.Forms;
...
WriteLine("foo");
def x = SWF.Form();
def doc = Xml.XmlDocument();
In Nemerle, you can apply the usingdirective to classes as well as namespaces. Opened namespaces allow you to drop the prefix of other namespaces, likeSystem inSystem.XmlMore info.
using System.Windows.Forms;

Button button = control as Button;

if (button != null)
...
else
...
match (control) {
| button is Button => ...
| listv is ListView => ...
| _ => ...//something else
}
as can be simulated withmatch. It is a bit more to type up in simple cases, but in general Nemerle's construct is more powerful.
int y = x++;
++x;
def y = x;
x++;
++x;
The ++ and -- operators return void, just like assignment. So, both prefix and postfix versions are equivalent.

Changes In Type Definitions

C# Nemerle Remarks
static int foo (int x, string y)
{ ... }
static foo (x : int, y : string) : int
{ ... }
Types are written after variable names.
class Foo {
public Foo (int x)
{ ... }
}
class Foo {
public this (x : int)
{ ... }
}
The constructor's name is alwaysthis.
class Foo {
~Foo ()
{ ... }
}
class Foo {
protected override Finalize () : void
{ ... }
}
There is no special syntax for the destructor, you just override theFinalizemethod.
class Foo : Bar {
public Foo (int x) : base (x)
{ ... }
}
class Foo : Bar {
public this (x : int) {
base (x);
...
}
}
The base constructor is called in the constructor's function body.
class Foo {
int x;
}
class Foo {
mutable x : int;
}
Fields which will be changed outside of the constructor need to be marked asmutable.
class Foo {
readonly int x;
const int y = 10;
}
class Foo {
x : int;
y : int = 10;
}
Read-only/const are used by default.
class Foo {
static int x = 1;
}
class Foo {
static mutable x : int = 1;
}
Static variable.
class Foo {
static readonly int x;
static int method() { ... }
}
module Foo {
x : int;
method() : int { ... }
}
A module is a class in which all members are static.
using System.Runtime.CompilerServices.CSharp;

class C {
public object this [int i]
{ ... } [IndexerName("MyItem")]
public int this [string name]
{ ... }
}
class C {
public Item [i : int] : object
{ ... } public MyItem [name : string] : int
{ ... }
}
Indexers.
C# Nemerle
When two interfaces use the same method to perform different functions, different names can be given to each method.
interface SpeaksEnglish{
void Speak();
} interface SpeaksGerman{
void Speak();
} class GermanTransfer : SpeaksEnglish, SpeaksGerman{
public void SpeaksEnglish.Speak() {}
public void SpeaksGerman.Speak() {}
}
interface SpeaksEnglish{
Speak() : void;
} interface SpeaksGerman{
Speak() : void;
} class GermanTransfer : SpeaksEnglish, SpeaksGerman{
public Speak() : void implements SpeaksEnglish.Speak{}
public Sprechen() : void implements SpeaksGerman.Speak{}
}

Generics

C# Nemerle Remarks
class A  { T x; }
class A [T] { x : T; }
Type parameters are written in square brackets [...].
typeof(A);
typeof(A[_,_]);
typeof expression

New Stuff

Nemerle contains many constructs which are not present in C#. Unfortunately, most of them don't really fit into a side-by-side comparison format:

Other Minor Differences

Ambiguity Isn't Tolerated

namespace YourAttributes{
class Serializable : System.Attribute { }
}
namespace MyAttributes{
using YourAttributes;
class Serializable : System.Attribute { } [Serializable] class SomeClass { }
}

C# compilers will choose MyAttributes.Serializable or, if its definition is commented out, YourAttributes.Serializable. Nemerle will raise an error telling you to be more specific about which attribute you want to use.

Exclusion of Overridden Methods

 class BaseClass
{
public virtual AddItem (val : string) : void { }
} class TestClass : BaseClass
{
public AddItem (val : object) : void { }
public override AddItem (val : string) : void { }
}
...
TestClass().AddItem ("a"); // C# will choose TestClass.AddItem (object)
// Nemerle will choose TestClass.AddItem (string)

This behaviour comes from section 7.6.5.1 of the C# specification, which states "...methods in a base class are not candidates [for overload resolution] if any method in a derived class is applicable (§7.6.5.1)." Unfortunately, this rule is patently absurd in situations like the above. The Nemerle compiler always chooses the method whose signature best matches the given arguments.

CSharp Similarities and Differences的更多相关文章

  1. The Similarities and Differences Between C# and Java -- Part 1(译)

    原文地址 目录 介绍(Introduction) 相似点(Similarities) 编译单位(Compiled Units) 命名空间(Namespaces) 顶层成员(类型)(Top Level ...

  2. Comparing the MSTest and Nunit Frameworks

    I haven't seen much information online comparing the similarities and differences between the Nunit ...

  3. A Brief Review of Supervised Learning

    There are a number of algorithms that are typically used for system identification, adaptive control ...

  4. TIJ——Chapter One:Introduction to Objects

    ///:~容我对这个系列美其名曰"读书笔记",其实shi在练习英文哈:-) Introduction to Objects Object-oriented programming( ...

  5. scala vs java 相同点和差异

    本贴是我摘抄自国外网站,用作备忘,也作为分享! Similarities between Scala and Java Following are some of the major similari ...

  6. Gestures_Article_4_0

    Technical Article Windows Phone 7™ Gestures Compared Lab version: 1.0.0 Last updated: August 25, 201 ...

  7. 15 things to talk about in a healthy relationship

    15 things to talk about in a healthy relationship男女交往中可以谈论的15个话题 1. Your Daily Activities 1. 你的日常活动 ...

  8. .net程序员必须知道的知识

    A while back, I posted a list of ASP.NET Interview Questions. Conventional wisdom was split, with ab ...

  9. SICP阅读笔记(一)

    2015-08-25   008   Foreword    QUOTE: I think that it's extraordinarily important that we in compute ...

随机推荐

  1. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

  2. JS调用Java函数--DWR框架

    (1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJA ...

  3. oracle 自定义 聚合函数

    Oracle自定义聚合函数实现字符串连接的聚合   create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象      sum ...

  4. Redis 转

    Redis 简介 Redis实践 Redis命令总结

  5. 在centos6.5上面mount微软系统上安装ftp服务器

    ---恢复内容开始--- 现在用虚拟机开发linux软件,发现虚拟机提供的共享文件夹不能很好地工作,表现为: 1.我在windows上面修改了文件内容,在linux里面发现文件内容没有变化,需要做些等 ...

  6. linux连接远程服务器提示拒绝访问

    如上图,出现的问题是因为端口号错误,如果不是正常连接的端口号,那么就是端口号被恶意更改! 解决方案: 关掉或者开启需要的端口号注释!

  7. GPS定位原理

    多分钟吧(有人认为美国对其本土覆盖的GPS信号实行不同码率因此纯GPS定位也会很快,谁有美国朋友不妨让他拔卡试试)!因为美版机型其GPS模块的数据处理软件部分与欧版机型是不同的,欧版机型的数据处理软件 ...

  8. hdu5514Frogs(2015ACM-ICPC沈阳赛区F题)

    这题很容易转化到一个容斥计数问题.而用指数复杂度的枚举计数法显然会挂,只能考虑别的方法. 首先将a[i]用gcd(a[i], m)替换,排序去重后得到一组m的约数,而m不超过1e9,因此m的所有约数最 ...

  9. php编译器

    WordPress http://pan.baidu.com/s/1eQnOnv0 epp3: http://pan.baidu.com/s/1pJKFOD1 配合xampp: http://pan. ...

  10. 最长递增子序列LIS再谈

    DP模型: d(i) 以第 i 个元素结尾的最长递增子序列的长度. 那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d( ...