dotnet icon indicating copy to clipboard operation
dotnet copied to clipboard

Partial ObservableProperty in ObservableObject shows error CS0229 ambiguity between property and property

Open jpageacsys opened this issue 10 months ago • 10 comments

Describe the bug

I'm developing a WinUI application with Community Toolkit MVVM 8.4.0. I switched the properties in my application to use the new format. Here's one example:

[ObservableProperty]
public partial bool Returned { get; set; } = returned;

And this is a simplified version of the constructor for the object: public partial class Item(bool returned) : ObservableObject

This all works as expected and compiles fine but all uses of the property elsewhere show the Compiler Error CS0229. In this case it shows: Ambiguity between Item.Returned and Item.Returned. I only have the one property called Returned. As I said, it all compiles fine and works correctly but I'm not able to get rid of the error.

Regression

No response

Steps to reproduce

Create a class with the type ObservableObject and create a partial Observable Property. Use it elsewhere in the app.

Example:

public partial class Item(bool returned) {
    [ObservableProperty]
    public partial bool Returned { get; set; } = returned;
}

Then access the property somewhere else in the app.

Example:

var newItem = new Item(false);
newItem.Returned = true;

This shows the compiler error.

Expected behavior

I would like to remove the false alarm.

Screenshots

Image

IDE and version

VS 2022

IDE version

Version 17.13.1

Nuget packages

  • [ ] CommunityToolkit.Common
  • [ ] CommunityToolkit.Diagnostics
  • [ ] CommunityToolkit.HighPerformance
  • [x] CommunityToolkit.Mvvm (aka MVVM Toolkit)

Nuget package version(s)

8.4.0

Additional context

No response

Help us help you

Yes, but only if others can assist

jpageacsys avatar Feb 26 '25 16:02 jpageacsys

Confirmation

I am also experiencing this issue in the same conditions.

Steps to Reproduce

I have an ObservableProperty named FullName defined in an ObservableObject extending class Process.cs, as defined below:

/// <summary>
/// [Observable] A reference-friendly Process name in the form of "Code-Title".
/// </summary>
[ObservableProperty]
public partial string FullName {get; set;} = $"{Code}-{Title}";

When I attempt to access this property in my ViewModel class, like so:

/// <summary>
/// Serves the Process masterlist as a list of Process Full Name strings.
/// </summary>
public List<string> ProcessNames {
    get => Processes.Select(x => x.FullName).ToList();
}

My IDE shows this error:

Ambiguity between 'Process.FullName' and 'Process.FullName' CS0229 string Process.FullName { get; set; } 'FullName' is not null here.

Image

Environment Details

IDE:

Visual Studio Code

Version: 1.98.2 (user setup)
Commit: ddc367ed5c8936efe395cffeec279b04ffd7db78
Date: 2025-03-12T13:32:45.399Z
Electron: 34.2.0
ElectronBuildId: 11161602
Chromium: 132.0.6834.196
Node.js: 20.18.2
V8: 13.2.152.36-electron.0
OS: Windows_NT x64 10.0.26100

CommunityToolkit:

<PackageReference Include="CommunityToolkit.Maui" Version="11.1.0" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />

.NET Info:

.NET SDK:
 Version:           9.0.104
 Commit:            2750432faa
 Workload version:  9.0.100-manifests.5c4e24dc
 MSBuild version:   17.12.27+e0b90a9a8

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.26100
 OS Platform: Windows
 RID:         win-x64
 Base Path:   C:\Program Files\dotnet\sdk\9.0.104\

.NET workloads installed:
 [maui]
   Installation Source: SDK 9.0.100
   Manifest Version:    9.0.14/9.0.100
   Manifest Path:       C:\Program Files\dotnet\sdk-manifests\9.0.100\microsoft.net.sdk.maui\9.0.14\WorkloadManifest.json
   Install Type:              Msi

Configured to use loose manifests when installing new manifests.

Host:
  Version:      9.0.3
  Architecture: x64
  Commit:       831d23e561

.NET SDKs installed:
  9.0.104 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 9.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.36 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 8.0.14 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 9.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 6.0.36 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 8.0.14 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 9.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  None

Environment variables:
  Not set

global.json file:
  Not found

masonritchason avatar Mar 19 '25 16:03 masonritchason

"This all works as expected and compiles fine but all uses of the property elsewhere show the Compiler Error CS0229"

That's very weird. I also can't repro and I never saw this happen. @CyrusNajmabadi do you think this might be an IDE bug? Should they report this in VS Feedback?

Sergio0694 avatar Mar 19 '25 16:03 Sergio0694

Confirmation

I am also experiencing this issue in the same conditions.

...

Update

Oddly enough, I have another ObservableObject, Part.cs, with identical implementation. When I attempt to reference this class, I can. I'm including the source for each of these classes to compare.

Class Implementations

Process.cs:

using CommunityToolkit.Mvvm.ComponentModel;

namespace LotCoMPrinter.Models.Datasources;

...
public partial class Process(string Code, string Title, string Type, List<Part> Parts): ObservableObject {
    ...
    [ObservableProperty]
    public partial string Code {get; set;} = Code;

    ...
    [ObservableProperty]
    public partial string Title {get; set;} = Title;

    ...
    [ObservableProperty]
    public partial string FullName {get; set;} = $"{Code}-{Title}";

    ...
    [ObservableProperty]
    public partial string Type {get; set;} = Type;

    ...
    [ObservableProperty]
    public partial List<Part> Parts {get; set;} = Parts;
}

Part.cs

using CommunityToolkit.Mvvm.ComponentModel;

namespace LotCoMPrinter.Models.Datasources;

...
public partial class Part(string ParentProcess, string PartNumber, string PartName, string ModelNumber): ObservableObject {
    ...
    [ObservableProperty]
    public partial string ParentProcess {get; set;} = ParentProcess;

    ...
    [ObservableProperty]
    public partial string PartNumber {get; set;} = PartNumber;

    ...
    [ObservableProperty]
    public partial string PartName {get; set;} = PartName;

    ...
    [ObservableProperty]
    public partial string ModelNumber {get; set;} = ModelNumber;
}

Conditions of Functioning Reference

This method, in my ViewModel class, is able to reference Part.ModelNumber (via the SelectedPart property with type Part):

...
private async Task<Tuple<string, List<string>>> SerializeLabel(...) {
    ...
    // serialize the label if needed
    // This reference to SelectedProcess (type Process) throws IDE warning
    if (SelectedProcess!.Type.Equals("Originator")) {  
        string? SerialNumber;
        // assign/retrieve a cached serial number for this label
        // This reference does not throw IDE warning
        SerialNumber = await Serializer.Serialize(UICapture[1].Replace("Part: ", ""), SelectedPart!.ModelNumber, SerializeMode, BasketType);
        ...
    }
    ...
}

masonritchason avatar Mar 19 '25 16:03 masonritchason

That's very weird. I also can't repro and I never saw this happen. @CyrusNajmabadi do you think this might be an IDE bug? Should they report this in VS Feedback?

@Sergio0694 I have a feeling it may be. I tried to run my app, ignoring the problem warnings. The app builds and runs with no related warnings or errors.

masonritchason avatar Mar 19 '25 16:03 masonritchason

Looks like updating to Visual Studio 2022 preview 17.14 fixes this issue: https://github.com/dotnet/roslyn/issues/76949

jpageacsys avatar Mar 20 '25 16:03 jpageacsys

I have the same bug in VS Community v17.13.5

RainerWingel avatar Mar 28 '25 19:03 RainerWingel

same here

HppZ avatar Jun 29 '25 12:06 HppZ

hello... any update?

HppZ avatar Sep 03 '25 06:09 HppZ

Image

WpfApp2.rar.log

HppZ avatar Sep 03 '25 06:09 HppZ

repro is provided. @Sergio0694 vs2022 17.14.11 win11 24h2

HppZ avatar Sep 03 '25 06:09 HppZ