C # 6.0 có hoạt động với .NET 4.0 không?


275

Tôi đã tạo một dự án mẫu, với các tính năng C # 6.0 - tuyên truyền null và khởi tạo thuộc tính làm ví dụ, đặt phiên bản đích .NET 4.0 và nó ... hoạt động.

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);
    }
}

Điều đó có nghĩa là tôi có thể sử dụng các tính năng C # 6.0 cho phần mềm của mình nhắm mục tiêu .NET 4.0 không? Có bất kỳ hạn chế hoặc nhược điểm?


7
.Net phiên bản 2.0 - 3.5 sử dụng CLR v2.0. Các phiên bản mới hơn sử dụng CLR v4.0.
i3arnon

Hãy nhớ rằng, tối ưu hóa khôn ngoan: bạn đang thêm một kiểm tra if-null riêng cho mỗi con mèo như thế này
Terence

2
Trời ơi. Tôi đã phát triển một WCF nhắm mục tiêu v4.6 chỉ để "nhắc nhở" rằng máy chủ sản xuất sẽ không được nâng cấp cho đến năm 2018. Tôi nghĩ rằng một tháng làm việc sẽ cần một vài ngày để tái cấu trúc. Kết thúc sau năm phút. Cảm ơn bạn, Microsoft! : D
Eric Wu

Câu trả lời:


286

Có (chủ yếu). C # 6.0 yêu cầu trình biên dịch Roslyn mới, nhưng trình biên dịch mới có thể biên dịch nhắm mục tiêu các phiên bản khung cũ hơn. Điều đó chỉ giới hạn ở các tính năng mới không yêu cầu hỗ trợ từ khung .

Ví dụ: trong khi bạn có thể sử dụng tính năng nội suy chuỗi trong C # 6.0 với các phiên bản trước đó của .Net (vì nó dẫn đến một cuộc gọi đến string.Format):

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

Bạn cần .Net 4.6 để sử dụng nó với IFormattablechỉ phiên bản khung mới bổ sung System.FormattableString:

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

Các trường hợp bạn đề cập không cần các loại từ khung để làm việc. Vì vậy, trình biên dịch hoàn toàn có khả năng hỗ trợ các tính năng này cho các phiên bản khung cũ.


31
Trên thực tế, bạn không cần .Net 4.6, chỉ một vài loại được thêm vào trong đó. Bạn có thể tự thêm chúng vào các khung cũ hơn. Mã này hoạt động tốt trên .Net 4.0 và 3.5.
Svick

10
Có một danh sách nào đó để xem các tính năng C # 6 nào hoạt động trong .NET 4.0 không? Một cách khác để hỏi điều này sẽ là: những tính năng mới nào cần sự hỗ trợ từ khung và những tính năng nào không?
Rubenisme

1
@Rubenisme Tôi không thể nghĩ ra cái nào khác ngoài IFormattablephép nội suy chuỗi.
i3arnon

2
Tôi đoán chúng ta có thể nói tất cả các loại đường cú pháp có thể được sử dụng và nhắm mục tiêu đến các phiên bản khung cũ hơn. nói như vậy có ổn không?
mkb

4
@mkb vâng. Đường cú pháp chính xác là những tính năng chỉ dựa vào khả năng của trình biên dịch chứ không phải các tính năng của khung.
i3arnon

52

Chỉ muốn tập trung vào cách hiểu Wikipedia và các liên kết khác.

Khi Wikipedia nói C # 6.0 là với .NET Framework 4.6, điều đó chỉ có nghĩa là phiên bản sản xuất của trình biên dịch (msc.exe) sẽ là một phần của bản phát hành .NET Framework 4.6. Thông qua đa mục tiêu , các trình biên dịch như vậy có thể hỗ trợ các phiên bản phát hành .NET Framework thấp hơn. Tất nhiên, kể từ khi Roslyn trở thành một dự án nguồn mở, trình biên dịch giờ đây hoàn toàn là một thành phần riêng lẻ.

Khi một cái gì đó đề cập đến phiên bản CLR của 4.0.30319 (.0), nó thực sự có thể là .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Vì tất cả đều thực hiện Đặc điểm kỹ thuật CLR phiên bản 4. Chưa kể Xamarin / Mono cũng thực hiện cùng thông số kỹ thuật CLR.

Trang MSDN chưa được cập nhật đầy đủ, nhưng một số trang đã có .NET Framework 4.6 được liệt kê trong phần Thông tin phiên bản.

Trong tất cả, thông số kỹ thuật ngôn ngữ (cũng như trình biên dịch C #), thông số kỹ thuật CLR và bản phát hành .NET Framework không được kết hợp chặt chẽ với nhau. Nó cung cấp cho các nhà phát triển đủ linh hoạt để sử dụng các trình biên dịch mới để nhắm mục tiêu CLR và .NET Framework cũ hơn.


29

Có, bạn có thể sử dụng các trình biên dịch mới hơn cho các khung cũ hơn và có quyền truy cập vào các tính năng của trình biên dịch mới (miễn là các tính năng đó không yêu cầu các loại mới được giới thiệu trong .NET 4.6).

Các ví dụ khác về điều này là các phương thức với các tham số mặc định được giới thiệu với C # 4.0 (.NET 4.0) nhưng bạn có thể sử dụng chúng trong các dự án .NET 2.0 (C # 2.0) và .NET 3.5 (C # 3.0).

Bạn cũng có thể sử dụng Phương thức mở rộng (được giới thiệu trong C # 3.0) trong .NET 2.0 hoặc .NET 3.0 nếu bạn thực hiện một cách giải quyết nhỏ để làm cho trình biên dịch hài lòng để nó có thể tìm thấy một thuộc tính được giới thiệu trong .NET 3.5.


1

Nếu bạn đang sử dụng mô tả xây dựng, hãy nhớ thay đổi đường dẫn đến trình tạo mới:

đặt CPATH = C: \ Tệp chương trình (x86) \ MSBuild \ 14.0 \ Bin

[Tái tạo.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

Trả lời bởi @oobe thực sự là quan trọng. Tôi chỉ có thể xây dựng giải pháp của mình thông qua một tệp bó sau khi sử dụng MSBuild.exe từ C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.