C # 6.0 ทำงานกับ. NET 4.0 ได้หรือไม่


275

ฉันสร้างโครงการตัวอย่างโดยมีสารพัด C # 6.0 - การเผยแพร่ว่างและการเริ่มต้นคุณสมบัติเป็นตัวอย่างให้ตั้งค่าเวอร์ชันเป้าหมาย. NET 4.0 และใช้งานได้ ...

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

หมายความว่าฉันสามารถใช้คุณสมบัติ C # 6.0 สำหรับซอฟต์แวร์ของฉันที่กำหนดเป้าหมาย. NET 4.0 ได้หรือไม่ มีข้อ จำกัด หรือข้อเสียหรือไม่?


7
.Net เวอร์ชัน 2.0 - 3.5 ใช้ CLR v2.0 รุ่นที่ใหม่กว่าใช้ CLR v4.0
i3arnon

โปรดจำไว้ว่าเพิ่มประสิทธิภาพอย่างชาญฉลาด: คุณกำลังเพิ่ม if-null-check แยกต่างหากสำหรับแมวแต่ละตัวเช่นนี้
Terence

2
ความดีของฉัน ฉันได้พัฒนา WCF ที่กำหนดเป้าหมาย v4.6 เพียงเพื่อ "เตือน" ว่าเซิร์ฟเวอร์ที่ใช้งานจริงนั้นไม่ได้รับการอัปเกรดจนกว่าจะถึงปี 2561 ฉันคิดว่างานที่มีมูลค่าต่อเดือนจะต้องใช้เวลาไม่กี่วันในการสร้างใหม่ เสร็จสิ้นภายในห้านาทีขอขอบคุณ Microsoft! : D
Eric Wu

คำตอบ:


286

ใช่ (ส่วนใหญ่) C # 6.0 ต้องการคอมไพเลอร์ Roslyn ใหม่ แต่คอมไพเลอร์ใหม่สามารถรวบรวมการกำหนดเป้าหมายเวอร์ชันเฟรมเวิร์กที่เก่ากว่า สิ่งนี้ จำกัด เฉพาะฟีเจอร์ใหม่ที่ไม่ต้องการการสนับสนุนจากเฟรมเวิร์

ตัวอย่างเช่นในขณะที่คุณสามารถใช้คุณสมบัติการแก้ไขสตริงใน C # 6.0 ด้วย. Net รุ่นก่อนหน้า (เนื่องจากส่งผลให้มีการโทรหาstring.Format):

int i = 3;
string s = $"{i}";

คุณจำเป็นต้องใช้. Net 4.6 เพื่อใช้กับIFormattableเวอร์ชันเฟรมเวิร์กใหม่เท่านั้นที่จะเพิ่มSystem.FormattableString:

int i = 3;
IFormattable s = $"{i}";

กรณีที่คุณกล่าวถึงไม่ต้องการประเภทจากกรอบการทำงาน ดังนั้นคอมไพเลอร์สามารถรองรับคุณสมบัติเหล่านี้ได้อย่างสมบูรณ์สำหรับเวอร์ชันเฟรมเวิร์กเก่า


31
ที่จริงแล้วคุณไม่จำเป็นต้องใช้. Net 4.6 เพียงไม่กี่ประเภทที่เพิ่มเข้าไป คุณสามารถเพิ่มสิ่งเหล่านั้นลงในกรอบงานที่เก่ากว่าได้ด้วยตัวเอง รหัสนี้ใช้งานได้ดีบน. Net 4.0 และ 3.5
svick

10
มีรายการที่จะดูว่าคุณสมบัติ C # 6 ทำงานใน .NET 4.0 หรือไม่ อีกวิธีหนึ่งในการถามนี้คือ: ฟีเจอร์ใหม่ใดที่ต้องการการสนับสนุนจากเฟรมเวิร์กและฟีเจอร์ใดที่ไม่รองรับ
Rubenisme

1
@Rubenisme ฉันไม่สามารถคิดอื่นนอกเหนือจากการIFormattableแก้ไขสายอักขระ
i3arnon

2
ฉันเดาว่าเราสามารถพูดได้ว่าประโยคน้ำตาลทั้งหมดสามารถใช้และกำหนดเป้าหมายไปยังเวอร์ชันเฟรมเวิร์กที่เก่ากว่าได้ มันโอเคที่จะพูดอย่างนั้นเหรอ?
mkb

4
@mkb ใช่ น้ำตาลซินแทคติคเป็นคุณสมบัติที่ต้องพึ่งพาความสามารถในการรวบรวมเท่านั้น
i3arnon

52

เพียงแค่ต้องการเน้นวิธีทำความเข้าใจกับ Wikipedia และลิงก์อื่น ๆ

เมื่อ Wikipedia บอกว่า C # 6.0 นั้นอยู่กับ. NET Framework 4.6 มันก็หมายความว่าคอมไพเลอร์รุ่นที่ผลิต (msc.exe) จะเป็นส่วนหนึ่งของการวางจำหน่าย NET Framework 4.6 ผ่านการกำหนดเป้าหมายหลายคอมไพเลอร์ดังกล่าวสามารถสนับสนุนรุ่นที่ต่ำกว่าของรุ่น .NET Framework แน่นอนว่าเนื่องจาก Roslyn กลายเป็นโครงการโอเพ่นซอร์สคอมไพเลอร์จึงกลายเป็นองค์ประกอบส่วนบุคคลอย่างสมบูรณ์

เมื่อสิ่งที่อ้างถึงรุ่น CLR ของ 4.0.30319 (.0) จริง ๆ แล้วมันสามารถ. NET Framework 4 * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *) ตามที่พวกเขาใช้ ข้อมูลจำเพาะ CLR เวอร์ชัน 4 ไม่ต้องพูดถึง Xamarin / Mono ยังใช้ข้อกำหนด CLR เดียวกัน

หน้า MSDN ยังไม่ได้รับการอัพเดตอย่างสมบูรณ์ แต่บางหน้าก็มี. NET Framework 4.6 อยู่ในรายการ Version Version

ในทุกรายละเอียดภาษา (เช่นเดียวกับคอมไพเลอร์ C #), รายละเอียด CLR และ. NET Framework ออกไม่ได้คู่กันอย่างแน่นหนา มันช่วยให้นักพัฒนามีความยืดหยุ่นเพียงพอที่จะใช้คอมไพเลอร์ใหม่เพื่อกำหนดเป้าหมาย CLR ที่เก่ากว่าและ. NET Frameworks


29

ใช่คุณสามารถใช้คอมไพเลอร์ที่ใหม่กว่าสำหรับเฟรมเวิร์กที่เก่ากว่าและรับการเข้าถึงฟีเจอร์คอมไพเลอร์ใหม่ (ตราบเท่าที่ฟีเจอร์เหล่านั้นไม่จำเป็นต้องมีประเภทใหม่ที่เปิดตัวใน. NET 4.6)

ตัวอย่างอื่น ๆ ของวิธีนี้คือวิธีการที่มีพารามิเตอร์เริ่มต้นถูกนำมาใช้กับ C # 4.0 (.NET 4.0) แต่คุณสามารถใช้พวกเขาในโครงการ. NET 2.0 (C # 2.0) และ. NET 3.5 (C # 3.0)

คุณยังสามารถใช้ส่วนขยายวิธีการ (แนะนำใน C # 3.0) ใน. NET 2.0 หรือ. NET 3.0 ถ้าคุณทำวิธีแก้ปัญหาเพียงเล็กน้อยเพื่อทำให้คอมไพเลอร์มีความสุขดังนั้นจึงสามารถค้นหาแอตทริบิวต์ที่เปิดตัวใน. NET 3.5


1

หากคุณใช้ ascripts สิ่งก่อสร้างอย่าลืมเปลี่ยนเส้นทางไปยังตัวสร้างใหม่:

ตั้งค่า CPATH = C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin

[Rebuild.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END

1

คำตอบโดย @oobe เป็นการนำเข้าจริง ฉันสามารถสร้างโซลูชันของฉันผ่านไฟล์ชุดเท่านั้นหลังจากใช้MSBuild.exeจากC: \ Program Files (x86)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.