-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Error in ImmutableArray
initialization using C#12 collection literals
#92022
Comments
Looks like a bug in the linker. The compiler-synthesized
while it has this IL in the trimmed code:
|
Note the following from the draft C# language spec, which presumably indicates a runtime requirement:
That implies that types with |
Tagging subscribers to this area: @agocke, @sbomer, @vitek-karas Issue DetailsDescription
However, they work from CLI This can be especially painful because tests pass CI but then everything collapses at runtime initialization. Real life CI example:
Simplified example below: Reproduction Steps
Program.cs using System.Collections.Immutable;
Console.WriteLine($"Hello, World from {Constants.Coordinates[0]}");
public static class Constants
{
public static readonly ImmutableArray<string> Coordinates =
[
"a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8",
"a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7",
"a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6",
"a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5",
"a4", "b4", "c4", "d4", "e4", "f4", "g4", "h4",
"a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3",
"a2", "b2", "c2", "d2", "e2", "f2", "g2", "h2",
"a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1"
];
} immutable.csproj <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Expected behaviorRuns normally, prints this in all the cases Hello, World from a8 Actual behaviorFailes from Visual Studio or when the project is published:
From Visual Studio, while debugging:
Regression?No response Known WorkaroundsNo response Configuration
Other informationNo response
|
@agocke Would that also explain the error when debugging from VS? For me that's the most puzzling part |
Probably, I see something related when debugging immutables inside VS: Unfortunately, I can't repro this inside a small project, and can't share the big project. The things above is everything I can share. Hope this helps. |
#92060 should fix the problem with trimmed app using these. |
I don't think the VS problem is in any way related to the trimming problem. @eduherminio Could you please describe what exactly you did in VS to see the NullReferenceException? I tried to debug the app and it seems to work mostly fine. The only rough edge I see is when inspecting the array in a Watch window: And expanding the results fails with a rather cryptic error. @AaronRobinsonMSFT was there a followup to the diagnostics work mentioned in #81145? |
I can repro a similar problem as @lsoft ... I'll follow up on the debugger part. |
Simplest repro: clone https://github.com/eduherminio/dotnet-runtime-issue-92022, open it in VS and F5, but I think you're already into it. |
Not to my knowledge. I can take a look later today if needed though. The question is going to be if this is on the VS or runtime side, which boils down to - are we giving VS all the details it needs or does it need more? /cc @VSadov |
Thanks @eduherminio - for me a simple F5 works... but it does look very similar to the other failure from watch. What version of VS/.NET are you using? |
@AaronRobinsonMSFT - I tracked the answer internally - thanks a lot. Right now, it seems it's mostly a lack of functionality on the VS side - and it's being worked on. |
@vitek-karas let me know if any other extra information is needed:
|
@eduherminio I can't repro the app's crash with F5. The debugger differences are potentially explainable though. It seems the debugger doesn't run static constructors just to show the right values for static fields. For example: Console.WriteLine("Break here"); // Stopping here in the debugger Constants.V shows 0
Console.WriteLine(Constants.V); // This prints out 42
class Constants
{
public static readonly int V = 42;
} Runtime will run the static constructor (which is what actually assigns the value 42 into the field) before any access to that field, but it does so as late as possible - so in this case it does it right before it reads the value of the field to pass it to WriteLine. |
@vitek-karas Let me know if I can help in any other way about it.
I can perhaps provide the |
The problem when trimming is now fixed in both |
Closing as fixed |
Fix verified in RC2. |
Description
ImmutableArray
s are throwing an exception when being initialized at runtime in some circumstances:However, they work from CLI
This can be especially painful because tests pass CI but then everything collapses at runtime initialization. Real life CI example:
immutable-arrays-cleaned
) and running it locally has the same behavior: works OK from command line, fails from VSSimplified example below:
Reproduction Steps
Program.cs
immutable.csproj
Expected behavior
Runs normally, prints this in all the cases
Actual behavior
Failes from Visual Studio or when the project is published:
From Visual Studio, while debugging:
Regression?
No response
Known Workarounds
No response
Configuration
Microsoft Visual Studio Enterprise 2022 (64-bit) - Version 17.7.0
Other information
No response
The text was updated successfully, but these errors were encountered: