C#中復合賦值運算符比Java規定了更多的轉換相關規則,不 過還是可以很直觀的理解:(注意上面用藍色色高亮的那句)只有當x op y和x = y都是合法的時候,x op= y才是合法的。
也正是因為 這樣,所以justjavac提到的Java的兩個陷阱在C#裡都不存在:
1、編譯錯誤:
C#代碼
static class Program { static void Main(string[] args) { byte b = 0; int i = 1; b += i; // error CS0266: 無法將類型“int”隱式轉換為“byte”。存在一個顯式轉換(是否缺少強制轉換?) } }
不用像Java那樣等到運行的時候再發現數據被剪了。
2、編譯沒問題,運行也沒問題:
C#代碼
using System;
using System.Linq.Expressions;
static class Program {
static void Main(string[] args) {
string s = "str: ";
object obj = (Expression<Func<int, int>>) (x => x + 1);
s += obj;
obj += s;
Console.WriteLine(s); // str: x => (x + 1)
Console.WriteLine(obj); // x => (x + 1)str: x => (x + 1)
}
}
==================
從OpenJDK的郵件列表裡挖個東西順帶放這兒:
Changeset: f09d6a3521b1 Author: jjg Date: 2008-03-06 10:07 -0800 URL: http://hg.openjdk.Java.Net/jdk7/hotspot-comp/langtools/rev/f09d6a3521b1 4741726: allow Object += String Summary: remove code in line with restriction removed from JLS RevIEwed-by: mcimadamore Contributed-by: michaelbailey0 at gmail.com ! src/share/classes/com/sun/tools/javac/comp/Attr.java + test/tools/javac/StringConversion2.java - test/tools/javac/expression/ObjectAppend.Java