Quá trình xây dựng VS2015 không có thông báo lỗi với Dynamic


136

Tôi đã viết một bài kiểm tra đơn vị trên một đoạn mã trả về JSON. Loại mà nó trả về là một loại ẩn danh, vì vậy tôi nghĩ để xác minh các giá trị trên đó, tôi chỉ cần đưa đối tượng đến dynamicđể thực hiện các xác nhận của mình.

Tuy nhiên, khi tôi làm điều đó, bản dựng của tôi thất bại nhưng tôi không có bất kỳ thông báo lỗi nào. Tôi đã có thể tái tạo điều này với mã rất đơn giản trong Dự án thử nghiệm đơn vị mới:

[TestMethod]
public void TestMethod1()
{
    var obj = new { someValue = true };

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

Xem bên dưới để chụp ảnh màn hình của bản dựng không thành công

xây dựng thất bại

Việc xây dựng thành công khi tôi nhận xét khẳng định mặc dù:

xây dựng thành công mà không cần khẳng định

Ngược lại, tôi đã chạy đoạn mã sau trong LinqPad 5 beta (sử dụng trình biên dịch Roslyn) và không gặp vấn đề gì:

var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());

Thật

Những gì đang xảy ra ở đây? Vì lỗi không hiển thị nên tôi không thể biết mình đang sử dụng dynamickhông chính xác hay là do không thể tìm thấy sự quá tải để sử dụng IsTrue()dynamichoặc đây là lỗi trong trình biên dịch (mặc dù tôi rất nghi ngờ điều này , Tôi không có bất kỳ bằng chứng nào cho thấy có gì đó không đúng với mã của tôi).

Liên quan đến vấn đề quá tải, tôi đã thử Assert.IsTrue((bool)asDynamic.someValue);nhưng quá trình xây dựng vẫn thất bại, vẫn không có thông báo lỗi.

Theo nhận xét của mỗi @ RonBeyer, tôi cũng đã thử nhiều lần casting hơn như dưới đây nhưng không có kết quả:

    dynamic asDynamic = (dynamic)obj;
    Assert.IsTrue(((dynamic)asDynamic).someValue);

    Assert.IsTrue((bool)asDynamic.somevalue);

Khi kiểm tra kỹ hơn, tôi thấy rằng có một lỗi được liệt kê trong cửa sổ đầu ra:

c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): lỗi CS0656: Thiếu trình biên dịch yêu cầu thành viên 'Microsoft.CSharp.R nbBinder.CSharpArgumentInfo.Create'

Được rồi, VS2013 tốt hơn trong việc báo cáo lỗi, tôi sẽ tìm kiếm dựa trên những lỗi đó:

nhập mô tả hình ảnh ở đây

Được rồi, việc thêm một tham chiếu đến Microsoft.CSharp đã sửa lỗi xây dựng , nhưng tôi sẽ bỏ ngỏ câu hỏi này vì có lẽ đó là một vấn đề với VS2015 mà (theo tôi) nên được giải quyết.


Bạn có chắc chắn đó thực sự là một lỗi biên dịch chứ không phải là một lỗi liên kết?
David W

Bạn có thể thử dynamic asDynamic = (dynamic)obj;không Hoặc chỉ trong phần Xác nhận, nhận xét động và viết Assert.IsTrue(((dynamic)obj).someValue);.
Ron Beyer

@RonBeyer vâng, tôi cũng đã thử cả hai thứ đó, không phải là may mắn.
DLeh

Thêm một ... Assert.IsTrue((bool)asDynamic.someValue);?
Ron Beyer

1
Tôi đã gặp vấn đề tương tự trong VS2015 trong khi cố gắng sử dụng động trong các phương pháp thử nghiệm. Việc xây dựng thất bại mà không có bất kỳ lỗi nào. Và sau khi thêm tham chiếu Microsoft.CSharp, bản dựng đã thành công.
Sarath Rachuri

Câu trả lời:


226

Có lỗi trình biên dịch, Visual Studio 2015 chỉ không báo cáo lỗi đúng. Tuy nhiên, Visual Studio 2013 không:

Điều này được trả lời ở đây: https://stackoverflow.com/a/13568247 :

Nói ngắn gọn:

Thêm một tham chiếu đến Microsoft.CSharp để sử dụng dynamicnhư thế này.


9
Thêm tham chiếu vào Microsoft.CSharpdll mặc dù using Microsoft.CSharp;không gây ra lỗi thời gian biên dịch.
Barry Guvenkaya

45
Thay vào đó, với .NET Core, hãy thêm gói NuGet Microsoft.CSharp.
Bart Verkoeijen

6
Tương tự đối với thư viện lớp dựa trên .Net Standard - thêm gói NuGet Microsoft.CSharp.
Hồng

49

Như hai người đã lưu ý trong các nhận xét, đối với Net Core và NetSt Chuẩn, vấn đề này đôi khi được khắc phục bằng cách thêm một tham chiếu NuGet vào Microsoft.CSharp.


3
Điều này đã giải quyết vấn đề của tôi sau khi chuyển đổi một dự án sang .NET Standard, cảm ơn bạn!
Joakim Skoog

1
Ditto với tập lệnh SSIS thêm một bảng excel.
SteveCav

@JoakimSkoog ... Tôi gặp vấn đề này trong một dự án .NET Standard (không bao giờ được chuyển đổi) và vẫn phải thêm vào một tham chiếu thủ công.
ebol2000

1

Có vấn đề này khi sử dụng từ khóa động kết hợp với Newtonsoft.json trong dự án .net 3.0.

Cách khắc phục là bỏ hoàn toàn động và sử dụng JObject thay thế:

từ

dynamic locales = JObject.Parse(this.Locales);

đến

JObject locales = JObject.Parse(this.Locales);

0

Có một vấn đề được biết đến với các lỗi xây dựng không xuất hiện trong danh sách lỗi. Xem, ví dụ: https://github.com/dotnet/roslyn/issues/4567 .

Để làm việc xung quanh nó, trong cửa sổ "Danh sách lỗi", chọn menu thả xuống ở bên phải "Tin nhắn" và chọn "Build + IntelliSense".


0

Tôi gặp vấn đề tương tự và điều duy nhất giải quyết được cho tôi là nâng cấp gói NUnit của tôi lên phiên bản mới nhất.

Nhân tiện, khi bạn mở cửa sổ Nuget, hãy đảm bảo rằng bạn không hạ cấp gói của bạn (khi tôi có phiên bản 2.0.11, nó cho tôi thấy nâng cấp lên phiên bản 2.0.9 thực sự đang hạ cấp ...)

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.